Entity framework 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

我首先使用EF4.1代码。我有两个类,它们都与联系人类有一对一的关系。当我删除这两个类中的任何一个记录时,我希望联系人类中的关联条目也被删除

例:


我尝试了注释和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();
}