标签: self-tracking-entities

自我追踪实体的目的是什么?

我一直在阅读.net中的自跟踪实体以及如何从*.edmx文件生成它们.我正在努力理解的是生成这些实体的原因是什么让你了解基本的EF实体?此外,有些人提到了自我跟踪实体和Silverlight,但为什么要使用这些实体而不是客户端或RIA服务生成的共享类?

自我跟踪实体有什么意义,为什么要使用它们?

.net c# entity-framework self-tracking-entities

40
推荐指数
2
解决办法
2万
查看次数

自我跟踪实体与POCO实体

我们正在开始一个新的基于Web的产品,我们计划通过WCF服务公开我们的业务逻辑.我们将使用ASP.NET 4.0,C#,EF 4.0.将来我们希望基于这些服务构建iphone应用程序和WPF应用程序.我一直在阅读很多关于使用POCO和自我跟踪实体(STE)的内容,据我所知,STEs在网络方案中效果不佳.任何人都能更清楚地了解这个问题吗?

asp.net wcf poco entity-framework-4 self-tracking-entities

31
推荐指数
2
解决办法
1万
查看次数

通过WCF服务对分离的自我跟踪实体进行异步延迟加载导航属性?

我有一个WCF客户端,它将自我跟踪实体传递给使用MVVM构建的WPF应用程序.应用程序本身具有动态接口.用户可以根据他们在哪个角色或他们正在执行的任务来选择他们想要在他们的工作区域中可见的对象.

我的自我跟踪实体有很多导航属性,其中很多都不需要.由于其中一些对象可能非常大,我只想根据请求加载这些属性.

我的应用程序如下所示:

[WCF] <---> [ClientSide Repository] <---> [ViewModel] <---> [View]

我的模型是自我跟踪实体.在将Model返回到请求它的ViewModel之前,Client-Side Repository挂钩了一个LazyLoad方法(如果需要).所有WCF服务调用都是异步的,这意味着LazyLoad方法也是异步的.

LazyLoad的实际实现给我带来了一些麻烦.以下是我提出的选项.

编辑 - 我删除了代码示例,试图让这更容易阅读和理解.如果您想查看它,请参阅以前版本的问题

选项A.

异步Lazy从Getter中的WCF服务器中获取Model的属性

好:按需加载数据非常简单.XAML中的绑定会加载数据,因此如果控件在屏幕上,则数据会异步加载并在UI处于通知状态时通知UI.如果没有,没有任何负载.例如,<ItemsControl ItemsSource="{Binding CurrentConsumer.ConsumerDocuments}" />将加载数据,但是如果接口的Documents部分不存在,则不会加载任何内容.

错误:在启动之前,不能在任何其他代码中使用此属性,因为它将返回一个空列表.例如,如果尚未加载文档,则以下调用将始终返回false.

public bool HasDocuments 
{ 
    get { return ConsumerDocuments.Count > 0; }
}
Run Code Online (Sandbox Code Playgroud)

选项B.

在需要时手动调用加载数据

好:易于实现 - 只需添加LoadConsumerDocumentsSync()LoadConsumerDocumentsAsync()方法

错误:必须记住在尝试访问数据之前加载数据,包括在Bindings中使用它时.这可能看起来很简单,但它很快就会失控.例如,每个ConsumerDocument都有一个UserCreated和UserLastModified.有一个DataTemplate定义UserModel,其中ToolTip显示其他用户数据,如扩展名,电子邮件,团队,角色等.因此,在我的ViewModel中显示我必须调用的文档LoadDocuments,然后循环遍历它们并调用LoadConsumerModifiedLoadConsumerCreated.它可以继续下去......之后我必须LoadUserGroupsLoadUserSupervisor.它还存在循环循环的风险,其中类似于User具有Groups[]属性的东西,并且Group具有Users[]属性

选项C.

到目前为止我最喜欢的选项...创建两种访问该属性的方法.一个同步和一个异步.绑定将对Async属性进行,任何代码都将使用Sync属性.

好:数据是根据需要异步加载的 - 正是我想要的.没有那么多额外的编码,因为我需要做的就是修改T4模板以生成这些额外的属性/方法.

不好:有两种方法来访问相同的数据似乎效率低下且令人困惑.您需要记住何时应该使用Consumer.ConsumerDocumentsAsync而不是 …

c# wcf lazy-loading self-tracking-entities async-await

22
推荐指数
1
解决办法
2959
查看次数

Microsoft不推荐的实体框架自我跟踪实体

在查看Microsoft的网站时,我发现他们不再建议使用自我跟踪实体.

下面的每个链接都是MS资源,提到不使用STE:

有谁知道为什么微软不再推荐使用STE?

.net c# entity-framework self-tracking-entities

18
推荐指数
2
解决办法
6796
查看次数

实体框架拆分表删除

我正在使用EF 4 STE来为Attachment对象建模.该附件包含了名称,描述,日期,以及最重要的数据(byte[]).为了优化加载,我不想在绝对必要之前检索Data属性,即当用户Download从客户端点击时.

为了遵循这种方法,我使用了这里描述的表拆分技术.我将附件表拆分为附件(名称,描述,日期)和附件数据(数据).这是我EF模型中的一对一关系.直到我尝试删除一切都很正常附件没有AttachmentData(即attachment.AttachmentData == null).我得到以下异常:

遇到无效数据.缺少必需的关系.检查StateEntries以确定约束违规的来源.

我看到了类似的帖子,但我似乎无法使用STE和ApplyChanges扩展方法.

现在我的数据访问代码很简单:我调用上下文ApplyChanges()后跟SaveChanges().

我尝试了一个简单的删除SQL函数,并将其映射到两个实体,并实际工作; 但它打破了插入物.我似乎无法将所有属性的插入函数映射到两个实体.

关于我可以尝试的其他一些选项的任何想法?Attachment和AttachmentData之间的关系可以是可选的吗?当我将其设为1到0+时,我得到一个映射错误Their primary keys may collide.

对任何建议开放.

谢谢!

c# sql entity-framework entity-framework-4 self-tracking-entities

13
推荐指数
1
解决办法
4091
查看次数

EF4 POCO:快照与WCF上的自我跟踪

去年,我使用Entity Framework(当然是.NET3.5)为我们的项目开发了一个数据访问服务,并使用Julie Lerhman的书作为指导开发了状态跟踪POCO对象.我们使用WCF并且还拥有Silverlight 3客户端.我们正在转向.NET 4.0,我想转而使用代码生成来消除浪费的开发人员编写POCO类和翻译类的时间.

通过我所做的研究,似乎有三种状态跟踪POCO:

1)更改了跟踪代理:对我们似乎没有用,因为它似乎不适用于WCF序列化.

2)基于快照:检索POCO实体图时拍摄快照,将客户端返回的图与该快照进行比较,比较差异......对我来说似乎不错.

3)自跟踪实体:代码生成器生成用于在POCO对象内进行自我跟踪的逻辑.这似乎与我们现在所做的很接近,除非它是为我们生成的.

我试图弄清楚所有这些方法之间的优缺点.我猜测1和2是"连接"的,并且他们需要最初查询POCO以保持实例化的ObjectContext,但是无法确认这一点.我也没有看到为什么有人会真的打扰选项1的原因,因为选项3似乎做同样的事情......

快照似乎对我来说最简单,但如果这需要ObjectContext保持打开很长一段时间我不太确定...

我只是一名初级程序员,所以这里有任何建议,特别是关于Silverlight 3(我相信选项2和3适用于Silverlight 3但2可能有问题)非常感谢.

wcf entity-framework snapshot poco self-tracking-entities

12
推荐指数
1
解决办法
8076
查看次数

自跟踪实体 - AcceptChanges无法继续,因为对象的键值与ObjectStateManager中的另一个对象冲突

我已经被这个问题困住了一个多星期了.希望有人能指出我正确的方向.

我首先简要介绍一下我的架构.

资产1 ---> 1地址* - > 1区* - > 1区* - > 1国家

套餐1 - >*资产

使用自我跟踪实体(STE)+ WCF.

脚步:

  1. 调用数据存储以获取资产列表.
  2. 调用数据存储以获取包列表.
  3. 用户选择一个包并为其分配一些资产.
  4. 保存包裹.

在步骤2中,呼叫使用预先加载的地址.

from p in context.Assets.Include("Address.Area.Region.Country")
Run Code Online (Sandbox Code Playgroud)

这是尝试呼叫时的错误

context.Packages.ApplyChanges(package)
Run Code Online (Sandbox Code Playgroud)

AcceptChanges无法继续,因为对象的键值与ObjectStateManager中的另一个对象冲突.在调用AcceptChanges之前,请确保键值是唯一的.

编辑

在窥探之后,我发现这是一个STE问题.问题是您无法持久存储包含此处概述的同一实体的多个实例的图形.这是我的问题.

如何将实体添加到我的实体集合中.新实体可能具有包含与集合中已有密钥相同的密钥的相关实体.即添加可能包含相同地址,区域,地区或国家/地区实体的新资产.

这是我的约束:

  1. 我必须使用导航集合,因为它会影响UI.
  2. 我无法预先获取将涉及的所有实体,因为数据集太大了.
  3. 我必须能够随时拍摄实体的快照以保留历史记录并使用它来"撤消"任何更改.

我知道Diego B Vega建议的可能解决方案,但这些不是我可以用于我的解决方案的选项.有没有人有任何其他想法?

wcf entity-framework self-tracking-entities objectcontext

12
推荐指数
2
解决办法
2万
查看次数

为什么实体在消失后仍然有效?

  1. 将新实体添加到TrackableCollection(context.Entities.Add(entity))(EntityState = New)
  2. 在不保存的情况下,从TrackableCollection(context.Entities.Remove(entity))中删除添加的实体(EntityState = Unmodified)
  3. 保存.(context.SubmitChanges())

我仍然从与实体关联的数据注释中获得验证错误,为什么?

    public class Entity
    {
       [Required]
       public string Name { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

c# entity-framework entity-framework-4 self-tracking-entities

12
推荐指数
1
解决办法
429
查看次数

在已编译的LINQ查询中使用lambda Include方法

我正在尝试通过预编译来优化程序中的一些LINQ查询.其中一些查询广泛使用了预先加载; 这是一个例子:

public static Func<DatabaseEntities, string, IQueryable<Employee>> GetAllByName =
              CompiledQuery.Compile<DatabaseEntities, string, IQueryable<Employee>
              ((context, name) => context.Employees
                     .Include(e => e.Email)
                     .Where(e => e.LastName == name));
Run Code Online (Sandbox Code Playgroud)

使用示例:

var employees = GetAllByName(dbContext, "Bob").ToList();
Run Code Online (Sandbox Code Playgroud)

不幸的是,尝试使用它会导致以下错误:

LINQ to Entities无法识别方法'System.Linq.IQueryable [Employee] Include [Employee,Email](System.Linq.IQueryable [Employee],System.Linq.Expressions.Expression [System.Func [Employee,Email]] )'方法,并且此方法无法转换为商店表达式.

我注意到,正常的加载加载方法(Include(string))在预编译查询中工作正常.有没有办法使用lambda版本?

c# linq-to-entities self-tracking-entities entity-framework-4.1

11
推荐指数
1
解决办法
1712
查看次数

EDMX模型的不同代码生成项之间有哪些本质区别?

我正试图加强实体框架,所以我不觉得自己处于黑暗时代.我尝试(并且迄今为止失败)从生成的代码中直觉了解可用代码生成项之间的本质区别.

似乎POCO将实体数据结构与将数据移入/移出数据存储区的ojbect隔离开来.

我不确定"自我跟踪实体"是什么.我猜测跟踪部分是指实现所谓的"工作单元"模式,但我不是正面的.更令人头疼的是,我想我想知道"自我追踪而不是什么?".

在此输入图像描述

c# entity-framework poco self-tracking-entities

10
推荐指数
1
解决办法
1927
查看次数