2011-03-25 40 views
26

一對多的關係,我有以下型號:實體框架CodeFirst許多與其他信息

class Contract 
{ 
    string ContractID{get;set;} 
    ICollection<Part> Parts{get;set;} 
} 

class Part 
{ 
    string PartID{get;set;} 
    ICollection<Contract> Contracts{get;set;} 
} 

的問題是,部分與合同之間的關係,還包含以下信息:

class ContractParts 
{ 
    Contract{get;set;} 
    Part{get;set;} 
    Date{get;set;} //additional info 
    Price{get;set;} //additional info 
} 

我將如何爲此編寫實體上下文?

回答

41

在這種情況下,你必須這樣建模您的實體:

public class Contract 
{ 
    public virtual string ContractId { get; set; } 
    public virtual ICollection<ContractPart> ContractParts { get; set; } 
} 

public class Part 
{ 
    public virtual string PartId { get;set; } 
    public virtual ICollection<ContractPart> ContractParts { get; set; } 
} 

public class ContractPart 
{ 
    public virtual string ContractId { get; set; } 
    public virtual string PartId { get; set; } 
    public virtual Contract Contract { get; set; } 
    public virtual Part Part { get; set; } 
    public virtual string Date { get; set; } //additional info 
    public virtual decimal Price { get; set; } //additional info 
} 

在導出的上下文必須定義:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<ContractPart>() 
       .HasKey(cp => new { cp.ContractId, cp.PartId }); 

    modelBuilder.Entity<Contract>() 
       .HasMany(c => c.ContractParts) 
       .WithRequired() 
       .HasForeignKey(cp => cp.ContractId); 

    modelBuilder.Entity<Part>() 
       .HasMany(p => p.ContractParts) 
       .WithRequired() 
       .HasForeignKey(cp => cp.PartId); 
} 
+0

感謝您的好回答!它有幫助。我知道如何使導航屬性變爲虛擬,但爲什麼你要使標量屬性變爲虛擬? – 2011-04-03 17:34:41

+1

它用於提高使用附加實體時的更改跟蹤性能。 – 2011-04-03 17:46:22

+0

對於您不想更改的屬性(例如主鍵),這是否正確? – 2011-04-03 19:58:34