我正在尝试使用实体框架更新数据库条目。实体如下:
public partial class Test
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid identity { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public TestRef Colour { get; set; }
}
public class TestRef
{
public int id { get; set; }
public string favColor { get; set; }
}
并且相关Controller中的编辑ActionResult如下:
public ActionResult Edit([Bind(Include = "identity,Name,Age,Colour")] Test test)
{
if (ModelState.IsValid)
{
test.Colour = db.TestRefs.Find(test.Colour.id);
db.Tests.Attach(test);
db.Entry(test).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(test);
}
所以在这里,Edit似乎适用于Test中除Color之外的所有属性(因为所有其他属性都得到了更新,但Color仍然保持原样,没有任何变化)。我假设这是因为它是一个联想,但我不能为我的生活找出原因。
答案 0 :(得分:3)
首先,告诉EF TestRef
有一把钥匙:
public class TestRef
{
[Key] /* <--- */
/*[DatabaseGenerated( ??? )] Does value generated by database? */
public int id { get; set; }
public string favColor { get; set; }
}
其次,将引用作为外键:
public partial class Test
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid identity { get; set; }
public string Name { get; set; }
public int Age { get; set; }
[ForeignKey("TestRefID")] /* <--- */
public TestRef Colour { get; set; }
}
上面代码中的名称TestRefID
只是示例。在数据库中输入FK列的名称。对于这种关系,你在数据库中有FK列,不是吗?
此外,如果您需要延迟加载,请设置Colour
属性virtual
:
...
[ForeignKey("TestRefID")]
public virtual TestRef Colour { get; set; }
...
EF将成为一种强制类型,对于所有虚拟引用属性,它将实现延迟加载逻辑。它是默认行为,直到您在数据库上下文设置中禁用它:
yourDataContext.ContextOptions.LazyLoadingEnabled = false;
顺便说一下,使用GUID作为主键并不是一个好主意。看看here的缺点和专业人士。