Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在实体框架中查找变更集_C#_.net_Entity Framework_Entity Framework 4 - Fatal编程技术网

C# 在实体框架中查找变更集

C# 在实体框架中查找变更集,c#,.net,entity-framework,entity-framework-4,C#,.net,Entity Framework,Entity Framework 4,我正在ASP.NET MVC3/WCF应用程序中使用EF4存储库。我使用工作单元模式将更改应用于数据库 用户需求之一是创建一个记录单/电子邮件,其中包含对实体的更改列表。是否有一种方法可以在以下函数中仅检测实体上已更改的属性 public void UpdateTrackedEntity<T>(T modifiedEntity) where T : class { var set = CreateObjectSet<T>(); set.ApplyCurre

我正在ASP.NET MVC3/WCF应用程序中使用EF4存储库。我使用工作单元模式将更改应用于数据库

用户需求之一是创建一个记录单/电子邮件,其中包含对实体的更改列表。是否有一种方法可以在以下函数中仅检测实体上已更改的属性

public void UpdateTrackedEntity<T>(T modifiedEntity) where T : class
{
    var set = CreateObjectSet<T>();
    set.ApplyCurrentValues(modifiedEntity);
}
public void UpdateTrackedEntity(T modifiedEntity),其中T:class
{
var set=CreateObjectSet();
set.ApplyCurrentValues(modifiedEntity);
}
是的,有一种方法:

public void UpdateTrackedEntity<T>(T modifiedEntity) where T : class
{
    var set = CreateObjectSet<T>();
    set.ApplyCurrentValues(modifiedEntity);
    var entry = ObjectStateManager.GetObjectStateEntry(modifiedEntity);
    // entry has two collections: CurrentValues (those you applied) and 
    // OriginalValues (those loaded from DB)
    // It also have method GetModifiedProperties to get collection of modified 
    // property names.
}
public void UpdateTrackedEntity(T modifiedEntity),其中T:class
{
var set=CreateObjectSet();
set.ApplyCurrentValues(modifiedEntity);
var entry=ObjectStateManager.GetObjectStateEntry(modifiedEntity);
//条目有两个集合:CurrentValues(您应用的)和
//原始值(从DB加载的值)
//它还有方法GetModifiedProperties来获取修改后的
//属性名称。
}

查看更多详细信息。

假设您的域服务对象是DsrvObj

 DsrvObj.EntityContainer.GetChanges() 
                      ...GetChanges().AddedEntities.Count /*also possible for modified and romoved ones*/
//这些也可能是有益的

           DsrvObj.HasChanges
           DsrvObj.MS_EntitySets.HasChanges
将为您提供变更集,但有趣的是,我今天在这个变更集上看不到一些修改过的布尔字段!最后我意识到,例如,如果DataGrid处于编辑模式,您的更改不会转到变更集,在结束编辑后,它会转到变更集


实施它,测试它,信任它

在进行GetObjectStateEntry调用时,我遇到以下错误,ObjectStateManager不包含引用类型为“”的对象的ObjectStateEntry,T是我的实体type@kolhapuri:是的,没错。必须将附加的实例传递给
ObjectStateManager
。您使用的是POCOs还是EntityObjects?为您提供更多信息。。我改变了我的职能如下。Objectset中存在原始属性。Context.Users.Attach(原始属性);var entry=Context.UpdateTrackedEntity(modifiedEntity);return entry.GetModifiedProperties();公共ObjectStateEntry UpdateTrackedEntity(T modifiedEntity),其中T:class{var set=CreateObjectSet();set.ApplyCurrentValues(modifiedEntity);return ObjectStateManager.GetObjectStateEntry(modifiedEntity);}@kolhapuri:Tyr使用第二个重载
GetObjectSateEntry
,该重载接受
EntityKey
。从POCO获取实体密钥有点困难。检查这个答案:我在那里描述了如何将其用于其他目的。