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

C# 从多对多关系中仅删除一个条目,c#,entity-framework,many-to-many,C#,Entity Framework,Many To Many,好的,我现在有这个问题。我有两个这样的型号: public class Contact: BaseModel { public string LastName { get; set; } public string FirstMidName { get; set; } public string Adress { get; set; } public int UserID { get; set; }

好的,我现在有这个问题。我有两个这样的型号:

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; }
    }
公共类联系人:BaseModel
{
公共字符串LastName{get;set;}
公共字符串FirstMidName{get;set;}
公共字符串地址{get;set;}
public int UserID{get;set;}
[显示(Name=“全名”)]
公共字符串全名
{
得到
{
返回FirstMidName+“”+LastName;
}
}
公共虚拟列表组{get;set;}
公共虚拟用户用户{get;set;}
公共虚拟ICollection电话{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; }

    }
公共类组:BaseModel
{
公共字符串名称{get;set;}
public int UserID{get;set;}
公共虚拟用户用户{get;set;}
公共虚拟列表联系人{get;set;}
}

这个想法是,许多联系人可以在许多组中。但我的问题来了。我删除了多对多级联的约定,因为我必须这样做,否则我的代码将无法工作。。。如何仅删除一个联系人。。。没有它,级联并删除它所在的所有组以及该组包含的所有联系人,依此类推。这是我的问题,我希望能够删除一个联系人,而不是一组联系人。我不想删除该组,只想删除联系人。请帮助

对于该关系,您只需保持
级联删除
选项处于打开状态

在多对多关系中,没有一方“拥有”另一方。相反,该关系由第三个实体(隐藏在您的案例中)维护,称为“链接”表,因此,例如,删除联系人将简单地删除与该联系人关联的组链接,而不是实际的组实体。删除组时也同样适用

编辑:虽然上述内容一般适用,但实际问题是由问题中未提及的两个
一对多
关系(
User->Contact
User->Group
)造成的,该问题默认情况下已启用
级联删除
。这导致了一个经典的多级联路径问题-当删除
用户
记录时,链接表
组联系人
记录可以通过
用户->联系人->组联系人
用户->组->组联系人
删除,因此是一个多删除路径


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

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

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

为什么不让每个小组都有一份小组中所有联系人的名单呢


这是你的第一个选择,但如果你真的需要让它工作,也许你想建立一个

我不能。。当我更新数据库时,它给了我一个错误!在表“GroupContact”上引入外键约束“FK_dbo.GroupContact_dbo.Contact_Contact_ID”可能会导致循环或多个级联路径。指定“在删除时不执行操作”或“在更新时不执行操作”,或修改其他外键约束。无法创建约束。请参阅前面的错误。这意味着您在
联系人
之间有一些共同点。你能发布
BaseModel
类吗?或者,在类中,您可能有从用户到联系人、从用户到组的级联删除?公共类BaseModel{public int ID{get;set;}它只保存一个ID,BaseModel的整个思想是让我把它传递给BaseRepository,它默认设置为
User->Contact
User->Group
的一对多关系。你是说我的组有一个用户这一事实会产生问题吗?但这是一个问题,因为组必须连接到用户,因为只有该用户才能访问他/她的组。用户btw包含一个列表和一个列表,这是一个备选方案,但我需要使用多对多关系。。。而且。。必须有一种方法只删除一个实体吗?我可以编写sql语句来实现这一点。实体框架当然也可以这样做?所以我应该删除列表和列表?然后做映射表?映射表不能解决我的问题。它仍然给出FK的一个错误