ReferentialConstraint中的依赖属性映射到存储生成的列.列:';规格ID';

本文关键字:ID 规格 依赖 属性 映射 存储 ReferentialConstraint | 更新日期: 2023-09-27 18:25:05

我遇到了一个与现有问题类似的问题,题目相同,但略有不同。

我得到错误:

ReferentialConstraint中的依赖属性映射到存储生成的列。列:"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,但自动生成SpecificationID

我在创建DB时没有遇到任何错误,只有在尝试保存规范时才会出现错误。

ReferentialConstraint中的依赖属性映射到存储生成的列.列:';规格ID';

所以我找到了"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; }
}

我把Fluent 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();

如果有人有更好的解决方案,请发表评论。。。但这是我唯一能找到的将其作为纯代码优先管理的DB 来解决的方法