Dav*_*ave 4 entity-framework ef-code-first entity-framework-ctp5 entity-framework-4.1
如果我有以下课程:
public class Foo()
{
public int PropertyIWantUpdated {get; set;}
public int PropertyIDontWantUpdated (get; set}
public ICollection<Bar> Bars {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
保存到我的数据库时,而不是
context.Entry(thisFoo).State = EntityState.Modified;
Run Code Online (Sandbox Code Playgroud)
我正在使用
context.Entry(thisFood).Property(tf => tf.PropertyIWantUpdated).IsModified = true;
Run Code Online (Sandbox Code Playgroud)
如何保存对Bars的更改?
这取决于您要更新的内容.首先让我澄清一个重要的事实 - 如果你有分离的实体图(更多有关系的实体)并且你想要将所有更改传递给EF,你有责任告诉EF在每个实体和每个关系中发生了什么变化 - EF不会帮助你.
如果你要更新只是Bar实例,你没有改变关系(=您没有添加新的Bar到Foo或删除Bar从Foo),你只需要迭代Bars,并将它们设置为Modified状态.
如果您还更改了Bars集合的内容,则整个过程变得非常复杂,并且方法取决于您定义实体的方式=如果您使用独立或外键关联.
在外键关联的情况下(BarFK作为属性=在Bar你有类似的东西FooId)你遵循与开始时类似的方法.您迭代Bars并将状态设置为:
Modified如果Bar分配了现有的FooAdded如果Bar分配了新的Foo有一个大问题.如果Bar从Bars集合中删除了某些实例,则还必须将它们附加到上下文并相应地设置其状态:
Modified 如果FK应设置为nullDeleted如果Bar应该删除这一切只适用于一对多的关系.
如果你认为以前的方法很复杂,那么在独立关联的情况下(Bar没有FK属性 - 总是多对多关系的情况),这个过程就更糟了.独立关联有自己的对象跟踪状态=设置Bar实体上的状态不会持久保持新的关系.第一个问题是不能直接从DbContext API访问此对象 - 您必须转换DbContext为ObjectContext并使用它ObjectStateManager来获取ObjectStateEntry表示关系的访问权限.之后你必须正确设置它的状态,这不像它看起来那么容易,因为关系不能处于Modified状态 - 它只能在Unchanged,Added或者Deleted.这意味着如果您将Bar的关系从一个更改为另一个Foo,则必须首先找到旧关系并将其设置为已删除,然后您可以将新关系设置为已添加.如果你有多对多关系并且你也想添加,删除和更新相关对象(不仅仅是关系),这可能真的"非常有趣" - 尤其是你必须在某个地方保留已经改变的信息.能够正确设置所有状态.
有关此问题的更多讨论(EF中的全局)在这里 - 它与DbContext API无关,但由于新API只是旧ObjectContext API的包装,因此仍存在相同的问题.
你认为这是可行的吗?我不这么认为.因此,你应该尽量避免这种情况.有一些方法可以避免它:
| 归档时间: |
|
| 查看次数: |
1427 次 |
| 最近记录: |