EF4.1如何实现CascadeDelete,其中两个表在一个表中共享记录?

时间:2011-09-06 10:54:32

标签: entity-framework entity-framework-4.1

我正在使用EF4.1 Code First。我有两个类,它们都与联系人类有一对一的关系。当我删除两个类中任何一个类中的记录时,我也希望删除联系人类中的相关条目。

例如:

public class User
{
   public virtual int ID { get; set; }
   ...
   public virtual Contact Contact { get; set; }
}

public class Admin
{
   public virtual int ID { get; set; }
   ...
   public virtual Contact Contact { get; set; }
}

public class Contact
{
   public virtual int ID { get; set; }
   ...
}

我使用注释和流畅的API尝试了各种各样的东西,但还是无法设法让级联删除工作。在EF 4.1 Code First中实现此功能的正确方法是什么?

2 个答案:

答案 0 :(得分:0)

我认为如果要删除联系人,删除用户和管理员应该会有效:

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>();
   }
}

虽然我认为你想做相反的事情,这意味着你需要让联系人成为依赖实体

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;}
}

你可以使用除我在这里使用的TPC之外的其他类型的继承,因为DBMS不支持两个互斥的外键

答案 1 :(得分:0)

我不确定,但我认为您的联系人实体也需要UserAdmin个实体。

然后流畅的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();
}