0

我对 EF 中的更新完全感到困惑。试图通过互联网查找相关教程,但一无所获。

我有两个问题。

  1. 如何仅更新某个表的特定字段。
  2. 更新如何与导航属性一起使用?(i。如果我更新某个实体,那么 Ef(Linq to Entity) 也会更新它的导航属性?)

    [Table("master")]
    public class masterViewModel
    {
      [Key,ForeignKey("address")]
      public int id { get; set; }
      public string name { get; set; }
      public string lastName { get; set; }
      public virtual address address { get; set; }
    }
    
    public class address
    {
    [Key]
    public int id { get; set; }
    public string city { get; set; }
    public string state { get; set; }
    



    假设我有[masterViewModel.id=1 , masterViewModel.name="ABC" and masterViewModel.lastName=null ] [address.id=1 , address.city="xyz" and address.state=null]然后我在我看来我做了类似下面的事情

        @Html.DisplayFor(modelModel => Model.name)
        @Html.DisplayFor(modelModel => Model.address.city)
        @Html.HiddenFor(x => x.id)@Html.HiddenFor(x => x.address.id)
        @Html.EditorFor(modelModel => Model.address.state )
        @Html.EditorFor(modelModel => Model.lastName)
    



因为我在表单发布时将 DisplayFor 用于名称和字符串属性,所以我在我的控制器操作中从不 gt 这两个字段的值,所以我需要只更新“状态”(地址)和“lastName”(masterViewModel)属性的东西。

4

2 回答 2

2

一种方法是像@Kyle 建议的那样向我们隐藏其他属性的字段,但这会导致将不需要的属性从客户端传输到服务器并返回。它还暴露了额外的漏洞,因为恶意客户端可以创建将发送修改的发布请求,name因此city它还需要在您的服务器端进行一些额外的验证逻辑。

如果您不想更新所有属性,则必须将其告知 EF。假设您收到了带有相关地址的 masterViewModel,其中包含控制器操作的修改数据。现在您可以执行以下操作:

using (var context = new YourDbContext())
{
    // This will inform EF about your existing masterViewModel and related address
    context.MasterViewModels.Attach(masterViewModel);
    // Now you must explicitly tell which properties you want to update
    var masterEntry = context.Entry(masterViewModel);
    masterEntry.Property(m => m.lastName).IsModified = true; 
    var addressEntry = context.Entry(masterViewModel.address);
    addressEntry.Property(a => a.state).IsModified = true;
    context.SaveChanges(); 
}

顺便提一句。在您的情况下,地址看起来可以是存储在主表中的复杂类型,而不是单独的实体。

于 2012-04-25T06:56:42.823 回答
0

您只是没有在回发name中获得价值吗?address.city

要解决此问题,请为这些属性添加隐藏字段。

@Html.HiddenFor(modelModel => Model.name)
@Html.HiddenFor(modelModel => Model.address.city)

现在,当表单回传到服务器时,这些值将被包含在内。

于 2012-04-25T06:49:18.237 回答