2016-07-08 102 views
1

我正嘗試使用實體框架更新數據庫條目。這些實體如下:嘗試使用實體框架更新數據庫代碼首先

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; } 
} 

,並在相關的控制器編輯的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); 
} 

所以在這裏,編輯似乎所有的測試,除了顏色屬性的工作(在所有其他屬性都得到更新,但Color保持原樣,沒有變化)。我假設這是因爲它是一個協會,但我不能爲了我的生活找出原因。

+0

您需要更具體地瞭解什麼是不工作。 Color屬性是否在請求上正確綁定? Color屬性是否未在數據庫中設置? TestRef是否試圖鏈接此Test以存在於數據庫中?請給我們詳細信息。 – Jakotheshadows

+0

Color屬性是綁定的,但未在數據庫中設置。 TestRefs也已經存在於數據庫中。 – ASMoncrieff

回答

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將使direved類型和所有虛擬參考屬性將實施延遲加載邏輯。它的默認行爲,直到你在數據庫方面設置來禁用它:

yourDataContext.ContextOptions.LazyLoadingEnabled = false; 

順便說一句,這不是使用GUID作爲主鍵是個好主意。看看here的利弊。

+0

謝謝你,我會試試看。 – ASMoncrieff

+0

完美,這個作品,謝謝! – ASMoncrieff

相關問題