【问题标题】:How to save related new objects that comes from differents DBContext CTP5如何保存来自不同 DBContext CTP5 的相关新对象
【发布时间】:2011-03-04 11:08:06
【问题描述】:

我正在开发一个 MVC3 应用程序,并使用 DbContext 代码生成器从我的数据库中创建了我的 POCO 类。一切都很好,直到我陷入这种情况。请注意,我使用存储库模式,并且我为每个实体使用一个专用存储库,无论是否获取 DbContext 的新实例。

现在,我处于这种情况:

对象 A 与 B 具有一对多的关系(A 可以有一个或多个 B) 对象 B 与 C 具有多对一关系(C 可以有一个或多个 B) 对象 B 与 D 具有多对一关系(D 可以有一个或多个 B)

我应该添加一个新的对象 B,考虑到对象 C 和 D 还存在,所以我必须只做关系并且可以创建或更新对象 A。具体考虑A是客户,B是订阅(C和D是B中的虚拟对象属性)。

现在,如果我尝试保存,我在 C 和 D 表中得到了重复,而对象的管理似乎有效。 所以,我认为我应该在建立关系之前分离实体,但是当我调用 SaveChanges() 时,我得到了这个错误:

存储更新、插入或删除语句影响了意外数量的行 (0)。自加载实体后,实体可能已被修改或删除。刷新 ObjectStateManager 条目。

代码如下:

Customer customer = customerRepository.Get(ID); if (customer == null) { customer = new Customer(); customer.Email = Request.Form["Email"].ToString(); } Subscription subscription = new Subscription(); subscription.Active = true; subscription.DateSubscription = DateTime.Today; Object C = objectCRepository.Get(Request.Form["IDObjectC"]);//Get C object from database Object D = objectDRepository.Get(Request.Form["IDObjectD"]);//Get D object from database if (C != null) { //I tried also to detach the objects before adding to subscription subscription.C = C; subscription.D = D; customer.Subscriptions.Add(subscription); if (customer.IDCustomer == 0) customerRepository.Add(customer); else UpdateModel(customer); customerRepository.Save(); }

这里是客户存储库的添加和保存方法:

public override void Add(Cliente cliente) { db.Cliente.Add(cliente); } public override void Save() { foreach (var entry in db.ChangeTracker.Entries() .Where(e => e.State == EntityState.Modified || e.State == EntityState.Added || e.State == EntityState.Unchanged || e.State == EntityState.Detached)) { string state = ObjectContext.GetObjectType(entry.Entity.GetType()).Name + " " + entry.State.ToString(); if (ObjectContext.GetObjectType(entry.Entity.GetType()).Name.Equals("C") || ObjectContext.GetObjectType(entry.Entity.GetType()).Name.Equals("D")) { entry.State = EntityState.Unchanged; } dbContext.SaveChanges(); }

我也尝试将它用于对象 C 和 D。

((System.Data.Entity.Infrastructure.IObjectContextAdapter)dbContext).ObjectContext.Refresh(System.Data.Objects.RefreshMode.StoreWins, entry);

收到的错误是

要刷新的对象集合中索引 0 处的元素具有空 EntityKey 属性值或未附加到此 ObjectStateManager。

我注意到在 CTP5 中添加了选项 AsNoTracking(),我尝试使用它,但没有! 我还检查了操作中涉及的每个属性的并发模式,所有属性都设置为无。 我完成了想法:(!

任何帮助将不胜感激!谢谢!

【问题讨论】:

    标签: entity-framework-ctp5


    【解决方案1】:

    实际上,我在加载 AsNoTracking() 方法时解决了自己的问题,在保存实体之前,我将状态更改为 Unchanged。

    //加载时 Context.Object.AsNoTracking().SingleOrDefault(l => l.Property == Property); //关于保存 Object.State = EntityState.Unchanged; Object.SaveChanges();

    希望这对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 2019-03-19
      • 1970-01-01
      • 1970-01-01
      • 2015-07-30
      • 2011-07-15
      • 2017-04-12
      • 2021-10-10
      • 1970-01-01
      • 2020-10-07
      相关资源
      最近更新 更多