将实体模型属性替换为数据库中的值

本文关键字:数据库 实体模型 属性 替换 | 更新日期: 2023-09-27 18:26:58

我有一个实体框架对象模型,它有两个实体:

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记得第一次检查,尽管我后来用数据库中的检查替换了它。

我该如何处理第一张支票?

将实体模型属性替换为数据库中的值

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

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();
}