2014-10-01 54 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(); 

如果有人有更好的解决方案,请发表评论......但这是我能找到的解决方案,作为纯代码优先管理数据库的唯一方式。

相关问题