2012-03-07 117 views
0

更换实体模型属性我有两个实体的实体框架对象模型:与价值从数据库

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

我该如何摆脱第一次检查?

回答

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

嗯,这肯定会解决这个问题,但我需要'Alert'中的'Check'从头开始。我创建的对象图是可能需要几分钟才能完成的向导的对象模型。只有在最后我才能保存整个图表。 – 2012-03-07 14:27:09

+0

@RonaldWildenberg,那么我可以建议的唯一事情是,如果它存在,你就可以在开始时获得它。 – tvanfosson 2012-03-07 14:29:43

+0

这也可能是一个问题,因为该应用程序是多用户。在一个向导启动时存在的检查可能与向导结束时存在的检查不同,因为另一个用户可能导致了更多的检查被创建...... – 2012-03-07 14:44:09