entity-framework - Entity Framework 4 中的更新对象,需要一直先取吗?

标签 entity-framework entity-framework-4

我可能完全错了,但是使用 EF4 的简单插入和更新让我发疯。(EF 新手)

我创建了一个 noddy 项目并上传到这里

http://cid-9db5ae91a2948485.office.live.com/browse.aspx/PublicFolder?uc=1http://cid-9db5ae91a2948485.office.live.com/browse.aspx/PublicFolder?uc=1

如果您喜欢并解决问题,请随意下载。这太棒了。

简而言之,我希望有人告诉我,我怀疑的情况并非如此。

假设您有一个客户对象。在更新之前是否需要像删除一样先获取它?这对我来说似乎很疯狂。

鉴于您有一个保存方法(插入和更新都在这里完成)并且您将客户传递给它。您已经拥有所有详细信息。您将如何修改以使其工作?我收到各种错误。
每次我需要修改客户的 child 时,我都需要去数据库吗?

   public void Save(CustomerDTO customerDTO)
   {
     //convert dto to EF entity
      var entityCustomer=ToEntityCustomer(customerDTO)
      using(ctx=new CustomerContext())
      {

          if(efCustomer.CustomerId > 0)
          {
            //UPDATE

             //DO I NEED TO FETCH MY CUSTOMER AGAIN FROM THE DB EVEN THOUGH I ALREADY HAVE
             //HAVE ALL THE DETAILS? I have not done it here.?????

              ctx.Customers.Attach(entityCustomer);
              ctx.ApplyCurrentValues(entityCustomer);

              //Also Customer has addresses so
              foreach(var address in entityCustomer.Addresses)
              { 
                 //some may be new addresses some might be modified one
                 ?????? lost
              }

          }
          else
          {
              ///INSERT
             ctx.Customers.AddObject(entityCustomer);
             ctx.ObjectStateManager.ChangeObjectState(entityCustomer,EntityState.Added);
             foreach(var address in entityCustomer.Addresses)
              { 
                 ctx.ObjectStateManager.ChangeObjectState(address ,EntityState.Added);
              }
          }

        ctx.SaveChanges();
      }     
  }

最佳答案

如果您不想在保存之前获取对象,这是一种方法:

public bool Save(CustomerInfo customerInfo)
{
    var entityCustomer = ToEntityCustomer(customerInfo);
    using (var ctx = new CustomerContext())
    {
        ctx.ContextOptions.LazyLoadingEnabled = false;
        DataAccess.Address[] addresses = new DataAccess.Address[entityCustomer.Addresses.Count];
        entityCustomer.Addresses.CopyTo(addresses, 0);
        entityCustomer.Addresses.Clear();

        if (customerInfo.Id == 0) {
            ctx.Customers.AddObject(entityCustomer);
        }
        else if (customerInfo.Id > 0) {
            ctx.Customers.Attach(entityCustomer);
            ctx.ObjectStateManager.ChangeObjectState(entityCustomer, EntityState.Modified);
        }

        foreach (var address in addresses) {
            if (address.AddressID == 0) {
                ctx.Addresses.AddObject(address);
                entityCustomer.Addresses.Add(address);
            }
            else if (address.AddressID > 0) {
                ctx.Addresses.Attach(address);
                ctx.ObjectStateManager.ChangeObjectState(address, EntityState.Modified);
                if (customerInfo.Id == 0) {
                    // New Customer so we need to add the existing addresses 
                   // since the FK  on Address is 0
                    entityCustomer.Addresses.Add(address);
                }

            }
        }
        ctx.SaveChanges();
        return true;
    }
}

诀窍是在父对象(例如客户)上执行附加/添加对象之前删除子对象(例如地址),因为这两个操作会影响整个图,并且会导致各种问题。

关于entity-framework - Entity Framework 4 中的更新对象,需要一直先取吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4237005/

相关文章:

c# - 如何拥有超过1个多对多关系

c# - 将 2 个表绑定(bind)在一起(一对多关系)

c# - MVC Razor WebGrid 可空复杂类型

visual-studio - NUnit 首次在 Resharper 测试运行器中使用 Entity Framework 进行测试时速度非常慢

c# - 如何从单独的 ssdl + csdl + msl 文件而不是 edmx 创建 ObjectContext?

entity-framework-4 - 导入时的 EF4 Strip 表前缀

c# - 包 'Microsoft.EntityFrameworkCore.Tools.DotNet 1.0.0-msbuild2-final' 具有项目不支持的包类型 'DotnetCliTool'

c# - 实体数据模型不显示 MySql 选项

swift - 实体名称为零的核心数据实体

c# - EF4 Code First 数据库生成