假设我有这两个POCO:
public class Album {
public int ID { get; set; }
[Required]
public string Title { get; set; }
public short Rating { get; set; }
public int ArtistID { get; set; }
[Required]
public virtual Artist Artist { get; set; }
}
public class Artist {
public int ID { get; set; }
[Required]
public string Name { get; set; }
public virtual ICollection<Album> Albums { get; set; }
}
然后我执行这样的代码:
using (PickContext db=new PickContext()) {
Album pick=db.Albums.SingleOrDefault(a => a.ID==pickID);
if (pick==null) return;
pick.Rating=4;
db.SaveChanges();
我很惊讶我得到了这样的验证异常:
属性:“艺术家”,错误:“艺术家字段是必需的。”
当我更改查询以包含艺术家时:
Album pick=db.Albums.Include("Artist").SingleOrDefault(a => a.ID==pickID);
我不再有例外。如果我不告诉EF填充所有属性,并且它们不是必需的,它是否会简单地覆盖数据库中的这些FK?我原以为如果我检索一个实体并且没有分配属性,那么该属性将不会在数据库中更改。这不是真的吗?
答案 0 :(得分:1)
您无需为Artist使用必需属性。它只是告诉EF你的导航属性总是需要在那里。既然已经定义了,
public int ArtistID { get; set; }
由于不可为空,因此在数据库级别中需要ArtistID(我认为这是您在此处所需属性的预期)。我认为您可以删除所需的属性,然后这应该按预期工作。