2013-07-17 48 views
0

這裏的數據是我的問題:ASP.NET MVC 4如何編輯來自外鍵

我有一個包含一些屬性,如姓名等數據庫,但我也有2個細節attributs,他們是IISSettings和SQLSettings。

public class Environment 
    { 
    public int ID { get; set; } 

    public string Name { get; set; } 

    public virtual SQLSettings SQL { get; set; } 

    public virtual IISSettings IIS { get; set; } 
... 
} 

IISSettings和SQLSettings包含外鍵的名稱和ID。

當我嘗試更新環境,並且我只更改IISSettings或SQLSettings中的屬性時,Visual Studio告訴我沒有任何更改,可能是因爲在「標準」屬性中沒有任何更改。唯一改變的是IISSettings或SQLSettings中的值。 所以,我想知道如何將更改保存到我的數據庫,當我只想更新IISSettings或SQLSettings?

我的視圖模型:

public class EnvironmentViewModel : ViewModelBase 
{ 
    public Environment Environment { get; set; } 
    public IISSettings IISSettings { get; set; } 
    public SQLSettings SQLSettings { get; set; } 

    //create/details/delete functions etc. 

    internal void Edit() 
    { 
     try 
     { 
      db.Entry(Environment).State = EntityState.Modified; 
      db.SaveChanges(); 
     } 
     catch (DbUpdateConcurrencyException ex) 
     { 
      Debug.WriteLine("\nDbUpdateConcurrencyException : " + ex); 
     } 
    } 
    ... 
} 

ViewModelBase是我的分貝設置。標準DbSet:

public class ViewModelBase 
{ 
    protected MyDBContext db = new MyDBContext(); 
} 

public class MyDBContext : DbContext 
{ 
    public MyDBContext() 
     : base() 
    { 
    } 

    public DbSet<Environment> Environments { get; set; } 
} 

工作代碼:

<div class="editor-label"> 
    @Html.LabelFor(model => model.Environment.Name) 
</div> 
<div class="editor-field"> 
    @Html.EditorFor(model => model.Environment.Name) 
    @Html.ValidationMessageFor(model => model.Environment.Name) 
</div> 

不工作代碼:

<div class="editor-label"> 
    @Html.LabelFor(model => model.Environment.IIS.IISServer) 
</div> 
<div class="editor-field"> 
    @Html.EditorFor(model => model.Environment.IIS.IISServer) 
    @Html.ValidationMessageFor(model => model.Environment.IIS.IISServer) 
</div> 

這是當我試圖將更改保存到我的數據庫而我只是改變了一個名字SQLSettings,我得到一個錯誤。 DbUpdateConcurrencyException。

有什麼建議嗎? (如果我忘記了請告訴我):)

+0

也許'DbUpdateConcurrencyException'及其屬性的內容可以派上用場,在解決這一問題。 – CodeCaster

回答

0

我發現如何做到這一點。 只需要添加

@Html.HiddenFor(model => model.Environment.ID) 
@Html.HiddenFor(model => model.Environment.IIS.IISSettingsID) 
@Html.HiddenFor(model => model.Environment.SQL.SQLSettingsID) 

我編輯查看。 這給我的編輯()內EnvironmentController方法:

db.Environments.Attach(Environment); 
db.Entry(Environment).State = EntityState.Modified; 
db.Entry(Environment.IIS).State = EntityState.Modified; 
db.Entry(Environment.SQL).State = EntityState.Modified;