Entity framework EF4.1如何实现两个表在一个表中共享记录的级联删除?
我首先使用EF4.1代码。我有两个类,它们都与联系人类有一对一的关系。当我删除这两个类中的任何一个记录时,我希望联系人类中的关联条目也被删除 例:Entity framework EF4.1如何实现两个表在一个表中共享记录的级联删除?,entity-framework,entity-framework-4.1,Entity Framework,Entity Framework 4.1,我首先使用EF4.1代码。我有两个类,它们都与联系人类有一对一的关系。当我删除这两个类中的任何一个记录时,我希望联系人类中的关联条目也被删除 例: 我尝试了注释和fluentapi的各种方法,但仍然无法实现级联删除。首先在EF 4.1代码中实现这一点的正确方法是什么?我认为,如果您想在删除联系人时删除用户和管理员,这应该是可行的: public class User { public int ID { get; set; } public int ContactId { get
我尝试了注释和fluentapi的各种方法,但仍然无法实现级联删除。首先在EF 4.1代码中实现这一点的正确方法是什么?我认为,如果您想在删除联系人时删除用户和管理员,这应该是可行的:
public class User
{
public int ID { get; set; }
public int ContactId { get; set; }
public virtual Contact Contact { get; set; }
}
public class Contact
{
public int ID { get; set; }
public virtual List<User> Users {get; set;}
public Contact()
{
Users = new List<User>();
}
}
公共类用户
{
公共int ID{get;set;}
public int ContactId{get;set;}
公共虚拟联系人联系人{get;set;}
}
公共类联系人
{
公共int ID{get;set;}
公共虚拟列表用户{get;set;}
公众联络()
{
用户=新列表();
}
}
虽然我相信你想做相反的事情,这意味着你需要联系的是从属实体
public class User
{
public int ID { get; set; }
public bool IsAdmin {get; set;}
public virtual List<Contact> {get; set;}
public Contact()
{
Users = new List<User>();
}
}
public class Contact
{
public int ID { get; set; }
[ForiegnKey("Owner")]
public int UserId {get; set;}
public virtual User Owner {get; set;}
}
公共类用户
{
公共int ID{get;set;}
公共bool IsAdmin{get;set;}
公共虚拟列表{get;set;}
公众联络()
{
用户=新列表();
}
}
公共类联系人
{
公共int ID{get;set;}
[ForiegnKey(“所有者”)]
public int UserId{get;set;}
公共虚拟用户所有者{get;set;}
}
您可以使用我在这里使用的TPC以外的其他类型的继承,因为DBMS不支持两个互斥的外键,我不确定,但我认为您的联系人实体也需要
User
和Admin
实体
那么fluent api应该可以工作:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>()
.HasRequired(u => u.Contact)
.WithRequiredPrincipal(c => c.User)
.WillCascadeOnDelete();
modelBuilder.Entity<Admin>()
.HasRequired(a => a.Contact)
.WithRequiredPrincipal(c => c.Admin)
.WillCascadeOnDelete();
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity()
.HasRequired(u=>u.Contact)
.WithRequiredPrincipal(c=>c.User)
.WillCascadeOnDelete();
modelBuilder.Entity()
.HasRequired(a=>a.Contact)
.WithRequiredPrincipal(c=>c.Admin)
.WillCascadeOnDelete();
}
不幸的是,这不起作用,因为AdminUser是AdminGroup的一部分,AdminGroup也是用户的一部分,这意味着用户有一个联系人,但也有一个管理员和一个联系人。我可以通过为user和admin提供两个不同的联系人表来解决这个问题,但是因为它共享相同的数据,所以只有一个联系人表才有意义。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>()
.HasRequired(u => u.Contact)
.WithRequiredPrincipal(c => c.User)
.WillCascadeOnDelete();
modelBuilder.Entity<Admin>()
.HasRequired(a => a.Contact)
.WithRequiredPrincipal(c => c.Admin)
.WillCascadeOnDelete();
}