我正在使用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中实现此功能的正确方法是什么?
答案 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)
我不确定,但我认为您的联系人实体也需要User
和Admin
个实体。
然后流畅的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();
}