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

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 its 以及该组包含的所有联系人等等。 s my problem i 很希望能够删除一个联系人而不是一个组。我不希望只删除联系人的群组。请帮助

对于该关系,您只需将 cascade delete 选项设为 on

many-to-many关系中,none一方"owns"另一方。相反,该关系由称为 "link" table 的第三方实体(隐藏在您的案例中)维护,因此例如删除联系人将简单地删除组 links 绑定到该联系人,而不是实际的组实体。删除组时也是如此。

编辑: 虽然上述一般适用,但事实证明实际问题是由两个 one-to-many 关系(User->ContactUser->Group) 未在默认情况下 cascade delete 变为 on 的问题中提及。这导致经典的 多级联路径 问题 - 删除 User 记录时,可以删除 link table GroupContact 记录通过 User->Contact->GroupContactUser->Group->GroupContact,因此是一个多重删除路径。

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

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

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

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

这是你的第一个选择,但如果你真的需要让它工作,你可能想要构建一个 mapping table. Lots of examples of these around.