从多对多关系中仅删除一个条目
Deleting only one entry from Many-to-Many relationship
好的,所以我现在遇到了这个问题。我有 2 个这样的模型:
public class Contact: BaseModel
{
public string LastName { get; set; }
public string FirstMidName { get; set; }
public string Adress { get; set; }
public int UserID { get; set; }
[Display(Name = "Full Name")]
public string FullName
{
get
{
return FirstMidName+ " " + LastName;
}
}
public virtual List<Group> Groups { get; set; }
public virtual User User { get; set; }
public virtual ICollection<Phones> Phones { get; set; }
}
还有:
public class Group:BaseModel
{
public string Name { get; set; }
public int UserID { get; set; }
public virtual User User { get; set; }
public virtual List<Contact> Contacts { get; set; }
}
想法是许多联系人可以在多个组中。但是我的问题来了。我删除了多对多的 ondeleteCascade 约定,因为我必须这样做,否则我的代码将 t work.But... how can i delete only one contact... without it cascading and deleting all the groups it
s 以及该组包含的所有联系人等等。 s my problem i
很希望能够删除一个联系人而不是一个组。我不希望只删除联系人的群组。请帮助
对于该关系,您只需将 cascade delete
选项设为 on
。
在many-to-many
关系中,none一方"owns"另一方。相反,该关系由称为 "link" table 的第三方实体(隐藏在您的案例中)维护,因此例如删除联系人将简单地删除组 links 绑定到该联系人,而不是实际的组实体。删除组时也是如此。
编辑: 虽然上述一般适用,但事实证明实际问题是由两个 one-to-many
关系(User->Contact
和 User->Group
) 未在默认情况下 cascade delete
变为 on
的问题中提及。这导致经典的 多级联路径 问题 - 删除 User
记录时,可以删除 link table GroupContact
记录通过 User->Contact->GroupContact
或 User->Group->GroupContact
,因此是一个多重删除路径。
因此您必须至少关闭 User->Contact
、User->Group
或 Contact<->Group
关系 cascade delete
中的一个。不幸的是,这会导致维护问题,因为您将无法简单地删除所涉及的实体之一。由于我猜你不会经常删除用户,我建议你关闭 User->Group
关系级联删除并在删除 User
之前手动删除相关的 User.Groups
。或者在数据库中的 User
table 上放置一个删除触发器。
您需要考虑数据的结构。为什么每个联系人都必须持有所有组的列表?通过这样做,您系统中的每个联系人都拥有关于其他联系人的所有信息,包括他自己。
这是 SQL 告诉您数据关系没有意义的方式。
为什么不让每个组保存其组中所有联系人的列表?
这是你的第一个选择,但如果你真的需要让它工作,你可能想要构建一个 mapping table. Lots of examples of these around.
好的,所以我现在遇到了这个问题。我有 2 个这样的模型:
public class Contact: BaseModel
{
public string LastName { get; set; }
public string FirstMidName { get; set; }
public string Adress { get; set; }
public int UserID { get; set; }
[Display(Name = "Full Name")]
public string FullName
{
get
{
return FirstMidName+ " " + LastName;
}
}
public virtual List<Group> Groups { get; set; }
public virtual User User { get; set; }
public virtual ICollection<Phones> Phones { get; set; }
}
还有:
public class Group:BaseModel
{
public string Name { get; set; }
public int UserID { get; set; }
public virtual User User { get; set; }
public virtual List<Contact> Contacts { get; set; }
}
想法是许多联系人可以在多个组中。但是我的问题来了。我删除了多对多的 ondeleteCascade 约定,因为我必须这样做,否则我的代码将 t work.But... how can i delete only one contact... without it cascading and deleting all the groups it
s 以及该组包含的所有联系人等等。 s my problem i
很希望能够删除一个联系人而不是一个组。我不希望只删除联系人的群组。请帮助
对于该关系,您只需将 cascade delete
选项设为 on
。
在many-to-many
关系中,none一方"owns"另一方。相反,该关系由称为 "link" table 的第三方实体(隐藏在您的案例中)维护,因此例如删除联系人将简单地删除组 links 绑定到该联系人,而不是实际的组实体。删除组时也是如此。
编辑: 虽然上述一般适用,但事实证明实际问题是由两个 one-to-many
关系(User->Contact
和 User->Group
) 未在默认情况下 cascade delete
变为 on
的问题中提及。这导致经典的 多级联路径 问题 - 删除 User
记录时,可以删除 link table GroupContact
记录通过 User->Contact->GroupContact
或 User->Group->GroupContact
,因此是一个多重删除路径。
因此您必须至少关闭 User->Contact
、User->Group
或 Contact<->Group
关系 cascade delete
中的一个。不幸的是,这会导致维护问题,因为您将无法简单地删除所涉及的实体之一。由于我猜你不会经常删除用户,我建议你关闭 User->Group
关系级联删除并在删除 User
之前手动删除相关的 User.Groups
。或者在数据库中的 User
table 上放置一个删除触发器。
您需要考虑数据的结构。为什么每个联系人都必须持有所有组的列表?通过这样做,您系统中的每个联系人都拥有关于其他联系人的所有信息,包括他自己。
这是 SQL 告诉您数据关系没有意义的方式。
为什么不让每个组保存其组中所有联系人的列表?
这是你的第一个选择,但如果你真的需要让它工作,你可能想要构建一个 mapping table. Lots of examples of these around.