2015-09-14 154 views
0

我在應用程序中有以下實體。使用Fluent API映射實體關係 - 實體框架

Student 
Parent (This Parent can be Father/Guardian) 
Address 

他們有以下類定義。

public Class Student 
{ 
    public int StudentId {get; set;} 

    //Addresses 
    public Address TemporaryAddress {get;set;} 
    public Address PermanentAddress {get;set;} 

    //Parent 
    public Parent Father {get;set;} 
    public Parent Guardian {get;set;} 
} 

public class Parent 
{ 
    public int ParentId {get;set;} 
    public string Name {get;set;} 

    //Addresses 
    public Address TemporaryAddress {get;set;} 
    public Address PermanentAddress {get;set;} 

} 

public class Address 
{ 
    public int AddressId {get;set;} 
    public string Country {get;set;} 
    public string State {get;set;} 
    public string Town {get;set;} 
    public string House# {get;set;} 
} 

,我想有以下排序

Student 
     ->TemporaryAddress (Address) 
     ->PermanentAddress (Address) 
     ->Father   (Parent) 
       ->TemporaryAddress (Address) 
       ->PermanentAddress (Address) 
     ->Guardian   (Parent) 
       ->TemporaryAddress (Address) 
       ->PermanentAddress (Address) 

換句話說它們之間的關係,

學生有一個TemporaryAddress和一個PermanentAddress。 學生有一個父親和一個監護人(他們都可以是相同的,即監護人也可以是父親) 父(父/監護人)有臨時地址和永久地址。

如何使用實體框架的Fluent API實現此?需要在地址和父實體中添加哪些其他字段以使此關係成爲可能。

謝謝。

+0

谷歌在主題標題,你會得到[答案](https://msdn.microsoft.com/en-us/數據/ hh134698.aspx)... – glautrou

回答

1

使用您爲Entity Framework提供的類創建必要的表和關係,從您的問題來看,它並不完全清楚您面臨的問題。但是,我認爲您希望ParentAddress關係是非可選的,而不是由可選的實體框架創建的默認關係。

您可以使用流暢的API來指定需要關係。這是指定一個Student需要的Father屬性非空值:

modelBuilder 
    .Entity<Student>() 
    .HasRequired(p => p.Father); 

實體框架默認會添加級聯刪除的外鍵關係所以刪除說Parent行會刪除相關的Address行。但是,由於您可以重複使用ParentAddress行,因此必須將其關閉。這可以通過刪除OneToManyCascadeDeleteConvention完成整個DbContext

把這個在一起,你可以使用流利的API創建一個DbContext

public class Context : DbContext { 

    public IDbSet<Student> Students { get; set; } 

    public IDbSet<Parent> Parents { get; set; } 

    public IDbSet<Address> Addresses { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) { 
    modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); 
    modelBuilder 
     .Entity<Student>() 
     .HasRequired(p => p.Father); 
    modelBuilder 
     .Entity<Student>() 
     .HasRequired(p => p.Guardian); 
    modelBuilder 
     .Entity<Student>() 
     .HasRequired(p => p.PermanentAddress); 
    modelBuilder 
     .Entity<Student>() 
     .HasRequired(p => p.TemporaryAddress); 
    modelBuilder 
     .Entity<Parent>() 
     .HasRequired(p => p.PermanentAddress); 
    modelBuilder 
     .Entity<Parent>() 
     .HasRequired(p => p.TemporaryAddress); 
    } 

}