尝试使用Entity Framework Code First更新数据库

时间:2016-07-08 15:56:50

标签: c# entity-framework ef-code-first

我正在尝试使用实体框架更新数据库条目。实体如下:

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仍然保持原样,没有任何变化)。我假设这是因为它是一个联想,但我不能为我的生活找出原因。

1 个答案:

答案 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的缺点和专业人士。