仅从多对多关系中删除一个条目

时间:2016-04-12 08:44:10

标签: c# entity-framework many-to-many

好的,我现在有这个问题。我有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喜欢能够删除一个联系人而不是一个群组。我不希望只删除联系人组。请帮忙

2 个答案:

答案 0 :(得分:2)

您只需将cascade delete选项保持为on即可。{/ p>

many-to-many关系中,没有任何一方拥有&#34;另一个。相反,这种关系由第三个实体(隐藏在你的案例中)维护,称为&#34; link&#34;表,例如删除联系人将简单地删除与该联系人关联的组链接,而不是实际的组实体。删除组时也是如此。

编辑虽然上述情况一般适用,但事实证明实际问题是由两个one-to-many关系(User->ContactUser->Group)引起的默认情况下cascade delete已转为on的问题中未提及。这导致了经典的多个级联路径问题 - 删除User记录时,GroupContact或{{1}可以删除链接表User->Contact->GroupContact记录因此是一个多重删除路径。

因此,您必须关闭User->Group->GroupContactUser->ContactUser->Group关系Contact<->Group中的至少一个。不幸的是,这会导致维护问题,因为您无法简单地删除所涉及的实体之一。由于我猜您不是经常删除用户,因此我建议您关闭cascade delete关系级联删除,并在删除User->Group之前手动删除相关的User.Groups。或者在数据库内的User表上放置一个删除触发器。

答案 1 :(得分:1)

您需要考虑数据的结构。为什么每个联系人都必须保存所有组的列表?通过这样做,系统中的每个联系人都会保存有关其他联系人的所有信息,包括他自己。

这是SQL告诉您数据关系没有意义的方法。

为什么不让每个小组都保留其小组中所有联系人的列表?

这是你的第一个选择,但如果你真的需要做这个工作,可能你想建立一个mapping tableLots of examples of these around.