首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >更改EntityFramework中的实体

更改EntityFramework中的实体
EN

Stack Overflow用户
提问于 2009-04-29 15:52:28
回答 3查看 4.3K关注 0票数 3

我有以下情况:

  1. 实体从数据库中加载。其中一个
  2. 以表单( WPF UserControl)形式呈现给用户,其中用户可以编辑该实体的属性。
  3. 用户可以决定将更改应用于实体或取消编辑。

我将如何在EntityFramework中实现这样的东西?

我的问题是,当我将UI直接绑定到实体的属性时,每个更改都会被实例化地应用到该实体。我希望将此延迟到用户按OK并实体被成功验证的时刻。

我考虑过用NoTracking加载实体,并在分离的实体验证后调用ApplyPropertyChanges,但我不完全确定正确的方法。MSDN上的EntityFramework的docu非常稀疏。

我可以想到的另一种方法是使用Refresh使用StoreWins来重新设置实体,但我不喜欢在Cancel上重置更改,而不喜欢在Ok应用更改。

有谁有好的教程或样本吗?

EN

Stack Overflow用户

回答已采纳

发布于 2009-05-02 01:22:02

一个选项是你说的做一个没有跟踪的查询。

代码语言:javascript
运行
复制
ctx.Customers.MergeOption = MergeOption.NoTracking;
var customer = ctx.Customers.First(c => c.ID == 232);

然后,客户可以根据内存中的需要修改'customer',并且上下文中实际上没有发生任何事情。

现在,当您想要进行更改时,您可以这样做:

代码语言:javascript
运行
复制
// get the value from the database
var original = ctx.Customers.First(c => c.ID == customer.ID);
// copy values from the changed entity onto the original.
ctx.ApplyPropertyChanges(customer); .
ctx.SaveChanges();

现在,如果您出于性能或并发原因对查询感到不舒服,可以添加一个新的扩展方法AttachAsModified(.)敬ObjectContext。

看起来是这样的:

代码语言:javascript
运行
复制
public static void AttachAsModified<T>(
    this ObjectContext ctx, 
    string entitySet, 
    T entity)
{
    ctx.AttachTo(entitySet, entity);

    ObjectStateEntry entry = 
            ctx.ObjectStateManager.GetObjectStateEntry(entity);

    // get all the property names
    var propertyNames = 
            from s in entry.CurrentValues.DataRecordInfo.FieldMetadata
            select s.FieldType.Name;

    // mark every property as modified    
    foreach(var propertyName in propertyNames)
    {
        entry.SetModifiedProperty(propertyName);
    }
}

现在您可以编写如下代码:

代码语言:javascript
运行
复制
ctx.Customers.MergeOption = MergeOption.NoTracking;
var customer = ctx.Customers.First();
// make changes to the customer in the form
ctx.AttachAsModified("Customers", customer);
ctx.SaveChanges();

现在您没有并发查询或外部查询。

现在唯一的问题是处理FK属性。您可能应该在这里查看我的提示索引:http://blogs.msdn.com/alexj/archive/2009/03/26/index-of-tips.aspx

希望这能有所帮助

亚历克斯

票数 3
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/803022

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档