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的一个错误