2011-09-06 47 views
0

我使用EF4.1 Code First。我有兩個類都與聯繫人類具有一對一的關係。當我在兩個類中的任何一箇中刪除記錄時,我都希望刪除聯繫人類中的關聯條目。EF4.1如何實現CascadeDelete,其中兩個表共享一個表中的記錄?

例如:

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

我認爲,如果你想刪除用戶和管理員聯繫人是否刪除這應該工作:

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不支持兩個相互排斥的外鍵

其他類型的繼承其他的3210
+0

不幸的是這是行不通的,因爲管理用戶是作爲用戶的一部分的AdminGroup的一部分,這意味着用戶有一個聯繫人,但也是一個具有聯繫人的管理員。我可以通過爲用戶和管理員提供兩個不同的聯繫人表來解決這個問題,但是因爲它共享相同的數據,所以只有一個纔有意義。 – JohnCambell

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(); 
} 
相關問題