1

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

4

1 回答 1

1

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

public int ArtistID { get; set; }

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

于 2013-07-18T03:37:27.123 回答