【问题标题】:Replace entity model property with value from database用数据库中的值替换实体模型属性
【发布时间】:2012-03-07 13:44:13
【问题描述】:

我有一个包含两个实体的实体框架对象模型:

Alert (1-*) ----- (1) Check

Check 表对UniqueProperty 列具有唯一约束。

检查通常是我数据库中预先存在的实体,任何新警报都应添加到现有检查中。

我在代码的某处创建了一个简单的对象图:

var alert = new Alert();
alert.Check = new Check { UniqueProperty = someValue };

稍后我想保留我的对象图:

using (var context = new MyContext())
{
  context.Alerts.AddObject(alert);

  // Replace temp check with actual database check if available.
  var checkFromDb = context.Checks.SingleOrDefault(
      c => c.UniqueProperty = alert.Check.UniqueProperty);
  if (checkFromDb != null)
  {
    alert.Check = checkFromDb;
  }
  context.SaveChanges();
}

所以,当数据库中有相应的检查时,使用那个,否则什么都不做(它会被简单地添加)。

上面的代码导致UniqueProperty 约束的唯一约束冲突。原因是 EF 会记住第一次检查,即使我稍后将其替换为数据库中的检查。

我怎样才能摆脱第一次检查?

【问题讨论】:

    标签: c# .net entity-framework entity-framework-4


    【解决方案1】:

    在您准备好保存之前不要设置支票。如果已经存在,请将警报添加到现有检查的警报集合中。如果没有,请创建一个与检查关联的新关联,然后将警报添加到数据库。

    var alert = new Alert();
    
    ...
    
    using (var context = new MyContext())
    {
    
      // Replace temp check with actual database check if available.
      var checkFromDb = context.Checks.SingleOrDefault(
          c => c.UniqueProperty = alert.Check.UniqueProperty);
      if (checkFromDb != null)
      {
        checkFromDb.Alerts.Add( alert );
      }
      else
      {
        alert.Check = new Check { UniqueProperty = some value };
        context.Alerts.AddObject(alert);
      }
      context.SaveChanges();
    }
    

    【讨论】:

    • 嗯,这肯定会解决问题,但我从一开始就需要Alert 中的Check。我创建的对象图是向导的对象模型,可能需要几分钟才能完成。只有在最后才能保存整个图表。
    • @RonaldWildenberg,那么我唯一可以建议的是,如果它存在的话,你可以从一开始就得到它。
    • 这也可能是一个问题,因为该应用程序是多用户的。一个向导启动时存在的检查可能与向导结束时存在的检查不同,因为另一个用户可能导致创建了更多检查...
    • 我正在尝试使用 ObjectStateManager 和 RelationshipManager,但我尝试的一切都只会导致其他异常。
    • @RonaldWildenberg 然后不要在向导中一直携带实体模型。使用视图/向导模型来保存数据,然后在最后一步创建实体。也就是说,就数据库而言,“假装”向导一步完成。这可能意味着您的逻辑需要能够在向导中备份。
    猜你喜欢
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 2010-10-26
    • 1970-01-01
    • 2016-12-27
    • 1970-01-01
    相关资源
    最近更新 更多