好的,我现在有这个问题。我有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; }
}
这个想法是许多联系人可以在许多组中。但这是我的问题。我删除了deleteCascade的约定,其中包含多对多,因为我不得不将我的代码放入t work.But... how can i delete only one contact... without it cascading and deleting all the groups it
并且所有组中包含的联系人等等等等。那个s my problem i
d喜欢能够删除一个联系人而不是一个群组。我不希望只删除联系人组。请帮忙
答案 0 :(得分:2)
您只需将cascade delete
选项保持为on
即可。{/ p>
在many-to-many
关系中,没有任何一方拥有&#34;另一个。相反,这种关系由第三个实体(隐藏在你的案例中)维护,称为&#34; link&#34;表,例如删除联系人将简单地删除与该联系人关联的组链接,而不是实际的组实体。删除组时也是如此。
编辑虽然上述情况一般适用,但事实证明实际问题是由两个one-to-many
关系(User->Contact
和User->Group
)引起的默认情况下cascade delete
已转为on
的问题中未提及。这导致了经典的多个级联路径问题 - 删除User
记录时,GroupContact
或{{1}可以删除链接表User->Contact->GroupContact
记录因此是一个多重删除路径。
因此,您必须关闭User->Group->GroupContact
,User->Contact
或User->Group
关系Contact<->Group
中的至少一个。不幸的是,这会导致维护问题,因为您无法简单地删除所涉及的实体之一。由于我猜您不是经常删除用户,因此我建议您关闭cascade delete
关系级联删除,并在删除User->Group
之前手动删除相关的User.Groups
。或者在数据库内的User
表上放置一个删除触发器。
答案 1 :(得分:1)
您需要考虑数据的结构。为什么每个联系人都必须保存所有组的列表?通过这样做,系统中的每个联系人都会保存有关其他联系人的所有信息,包括他自己。
这是SQL告诉您数据关系没有意义的方法。
为什么不让每个小组都保留其小组中所有联系人的列表?
这是你的第一个选择,但如果你真的需要做这个工作,可能你想建立一个mapping table。 Lots of examples of these around.