我一直在尝试使用以下代码更新实体:
var db = new MyContext();
var data = db.Tableau.Find(Id);
if (data != null)
{
data.Name = model.Name;
data.EmbedCode = model.EmbedCode;
db.SaveChanges();
}
问题是我的Tableaus表有一个Parent字段(FK对于DataTree表不是null)。有时当我将更改保存到此编辑记录时,我收到一条错误消息,指出“父字段是必需的”。但我不是在编辑父字段。父字段应该完整且存在,因为我只是在改变Name和EmbedCode字段。
如何进行?提前谢谢。
答案 0 :(得分:1)
这是因为您在null
表中的ParentId
列中允许Tableaus
个值,但在您的Tableau
实体中,您ParentId
为非nullable属性(这意味着需要关系),当您从数据库加载Tableau
实例时,EF希望您也设置该属性。尝试将该属性更改为可为空:
public int? ParentId {get;set;}
如果使用Fluent Api配置关系,则为:
modelBuilder.Entity<Tableau>()
.HasOptional(t=>t.Parent)
.WithMany(dt=>dt.Tablous)// if you don't have a collection nav. property in your DataTree entity, you can call this method without parameter
.HasForeignKey(t=>t.ParentId);
如果您希望ParentId
实体中的Required
属性为Tableau
,则需要确保每行数据库中该列的有效值。使用“有效值”,我的意思是它应该与默认值不同,它应该在DataTree
表中以PK的形式存在。
将相关实体作为查询的一部分加载的一种方法是使用Include
扩展方法:
var data = db.Tableau.Include(t=>t.Parent).FirstOrDefault(t=>t.Id==Id);