我对同一标题的现有问题有类似的问题,但略有不同。
我收到错误:
ReferentialConstraint中的依赖属性映射到存储生成的列。栏目:'规范ID'。
当我尝试保存到数据库时:
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
只有在尝试保存规范时,我才会在创建数据库时遇到任何错误。
答案 0 :(得分: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; }
}
我将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();
请评论是否有人有更好的解决方案......但这是我能找到的唯一方法来解决它作为纯代码优先管理的数据库