Database ASP.NET MVC 4如何编辑来自外键的数据

Database ASP.NET MVC 4如何编辑来自外键的数据,database,asp.net-mvc-4,Database,Asp.net Mvc 4,我的问题是: 我有一个数据库,其中包含几个属性,如名称等。但我也有两个特定属性,它们是iissetting和SQLSettings public class Environment { public int ID { get; set; } public string Name { get; set; } public virtual SQLSettings SQL { get; set; } public virtual IISSettings I

我的问题是:

我有一个数据库,其中包含几个属性,如名称等。但我也有两个特定属性,它们是iissetting和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中更改属性,visualstudio告诉我没有任何更改,可能是因为在“标准”属性中,没有任何更改。唯一改变的是IISSettings或SQLSettings中的值。 所以,我想知道,当我只想更新IISSettings或SQLSettings时,如何保存对数据库的更改

我的viewModel:

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是设置数据库的位置。标准数据库集:

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

公共类MyDBContext:DbContext
{
公共MyDBContext()
:base()
{
}
公共数据库集环境{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>

@LabelFor(model=>model.Environment.Name)
@EditorFor(model=>model.Environment.Name)
@Html.ValidationMessageFor(model=>model.Environment.Name)
非工作代码:

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

@LabelFor(model=>model.Environment.IIS.IISServer)
@EditorFor(model=>model.Environment.IIS.IISServer)
@Html.ValidationMessageFor(model=>model.Environment.IIS.IISServer)
当我试图将更改保存到数据库中,并且只更改SQLSettings的名称时,我会收到一个错误。DbUpdateConcurrencyException

有什么建议吗? (如果我忘了什么,请告诉我。)

我知道怎么做了。 只是需要补充一下

@Html.HiddenFor(model => model.Environment.ID)
@Html.HiddenFor(model => model.Environment.IIS.IISSettingsID)
@Html.HiddenFor(model => model.Environment.SQL.SQLSettingsID)
到我的编辑视图。 这是我在EnvironmentController中的Edit()方法:

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

在解决这个问题时,
DbUpdateConcurrencyException
的内容及其属性可能很有用。