EF导航属性和保存

时间:2013-07-17 23:49:38

标签: entity-framework

假设我有这两个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?我原以为如果我检索一个实体并且没有分配属性,那么该属性将不会在数据库中更改。这不是真的吗?

1 个答案:

答案 0 :(得分:1)

您无需为Artist使用必需属性。它只是告诉EF你的导航属性总是需要在那里。既然已经定义了,

public int ArtistID { get; set; }

由于不可为空,因此在数据库级别中需要ArtistID(我认为这是您在此处所需属性的预期)。我认为您可以删除所需的属性,然后这应该按预期工作。