2014-10-01 55 views
0

我遇到了一個類似的問題,與現有的問題具有相同的標題,但略有不同。ReferentialConstraint中的依賴屬性映射到商店生成的列。列:'SpecificationID'

我得到的錯誤:

A dependent property in a ReferentialConstraint is mapped to a store-generated column. Column: 'SpecificationID'.

當我嘗試保存到數據庫:

var doc = new Specification(); 
doc.ProjectComponentID = spec.ProjectComponentID; 
doc.Description = spec.Description; 
db.Specifications.Add(doc); 

db.SaveChanges(); 

當我創造了我使用的種子的方法來映射1對1或無關係數據庫:

modelBuilder.Entity<Specification>() 
      .HasRequired(pc => pc.ProjectComponent) 
      .WithOptional(s => s.Specification); 

我2個相關的實體是:

public class ProjectComponent 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int ProjectComponentID { get; set; } 

    public int ProjectID { get; set; } 
    public virtual Project Project { get; set; } 

    public int ProjectPhaseID { get; set; } 
    public virtual ProjectPhase Phase { get; set; } 

    ... other properties ... 

    public Nullable<int> SpecificationID { get; set; } 
    public virtual Specification Specification { get; set; } 
} 

public class Specification 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int SpecificationID { get; set; } 

    public int ProjectComponentID { get; set; } 
    public virtual ProjectComponent ProjectComponent { get; set; } 

    public string Description { get; set; } 

} 

我需要能夠將規範添加到PRojectComponent。使用ProjectComponentID提供規範,但自動生成規範ID僅當嘗試保存規範時,我纔會在創建數據庫時遇到任何錯誤。

回答

0

所以我找到了「A」解決方案。但我不相信它是最好的解決方案。

顯然,代碼優先的EF需要主鍵在一對一或零關係中共享。

因此,要解決這個問題,我已經取消了對每個實體的外鍵:

public class ProjectComponent 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int ProjectComponentID { get; set; } 

    public int ProjectID { get; set; } 
    public virtual Project Project { get; set; } 

    public int ProjectPhaseID { get; set; } 
    public virtual ProjectPhase Phase { get; set; } 

    ... other properties ... 

    public virtual Specification Specification { get; set; } 

} 

public class Specification 
{ 
    public int SpecificationID { get; set; } 
    public virtual ProjectComponent ProjectComponent { get; set; } 

    public string Description { get; set; } 
} 

,我修改了流利的API到以前的逆:保存時

modelBuilder.Entity<ProjectComponent>() 
      .HasOptional(pc => pc.Specification) 
      .WithRequired(s => s.ProjectComponent); 

現在數據庫,我沒有問題,它使用ProjectComponentID外鍵作爲SpecificationID主鍵:

var comp = db.ProjectComponents.Find(spec.SpecificationID); 
comp.Specification = new Specification {Description = spec.Description}; 

db.SaveChanges(); 

如果有人有更好的解決方案,請發表評論......但這是我能找到的解決方案,作爲純代碼優先管理數據庫的唯一方式。

相關問題