我正在尝试使用实体框架更新数据库条目。实体如下:
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保持了以前的状态,没有任何更改)。我以为这是因为它是一个关联,但是我无法一辈子找出原因。
首先,告诉EFTestRef
有一个密钥:
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
property virtual
:
...
[ForeignKey("TestRefID")]
public virtual TestRef Colour { get; set; }
...
EF将创建direved类型,并且对于所有虚拟引用属性,它将实现延迟加载逻辑。这是默认行为,直到您在数据库上下文设置中将其禁用为止:
yourDataContext.ContextOptions.LazyLoadingEnabled = false;
顺便说一句,使用GUID作为主键不是一个好主意。看看这里的缺点和优点。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句