问题标签 [self-tracking-entities]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 将 linq 查询作为对象发送到服务器
我有一些这样的 linq 查询:
我的问题是如何将这些类型的查询作为对象发送到服务器这里是我的 linq 查询是直接数据访问我需要将它们发送到我的数据服务器但我需要一个对象。我该如何实现呢?
inheritance - 一个类可以从实体框架类继承并仍然使用继承的类映射保留回数据库吗?
一个类可以从实体框架类继承并仍然使用继承的类映射保留回数据库吗?当我尝试从“自我跟踪实体”类派生时收到错误消息,并且 SaveChanges 指出该类型没有任何映射。由于 Type 是从 Entity 类继承的,因此我希望它也可以以某种方式继承实体映射以使其正常工作。有没有人能让这个工作?
我试图支持的方案是在另一个程序集中扩展实体对象,该程序集引用包含实体和映射的程序集。部分类和映射被编译到包含实体对象的程序集中。所以我不能通过使用部分类来实现这一点。
c# - 通过 WCF 服务异步延迟加载分离自跟踪实体的导航属性?
我有一个 WCF 客户端,它将自我跟踪实体传递给使用 MVVM 构建的 WPF 应用程序。应用程序本身有一个动态界面。用户可以根据他们所处的角色或他们正在执行的任务来选择他们希望在其工作区中显示哪些对象。
我的自跟踪实体有很多导航属性,其中很多是不需要的。由于其中一些对象可能非常大,我只想在请求时加载这些属性。
我的应用程序如下所示:
[WCF] <---> [ClientSide Repository] <---> [ViewModel] <---> [View]
我的模型是自我跟踪实体。客户端存储库在将模型返回给请求它的 ViewModel 之前连接了一个 LazyLoad 方法(如果需要)。所有 WCF 服务调用都是异步的,这意味着 LazyLoad 方法也是异步的。
LazyLoad 的实际实现给我带来了一些麻烦。这是我想出的选项。
编辑 - 我删除了代码示例以尝试使其更易于阅读和理解。如果您想查看,请查看以前版本的问题
选项 A
在 Getter 中从 WCF 服务器异步延迟加载模型的属性
好:按需加载数据非常简单。XAML 中的绑定会加载数据,因此如果控件在屏幕上,则数据会异步加载并在其存在时通知 UI。如果没有,则不会加载任何内容。例如,<ItemsControl ItemsSource="{Binding CurrentConsumer.ConsumerDocuments}" />
将加载数据,但是如果界面的 Documents 部分不存在,则不会加载任何内容。
错误:在启动之前无法在任何其他代码中使用此属性,因为它将返回一个空列表。例如,如果尚未加载文档,则以下调用将始终返回 false。
选项 B
需要时手动调用加载数据
好:易于实现 - 只需添加LoadConsumerDocumentsSync()
和LoadConsumerDocumentsAsync()
方法
不好:必须记住在尝试访问数据之前加载数据,包括在绑定中使用数据时。这可能看起来很简单,但它很快就会失控。例如,每个 ConsumerDocument 都有一个 UserCreated 和 UserLastModified。有一个 DataTemplate 定义了带有 ToolTip 的 UserModel,其中显示了额外的用户数据,例如扩展名、电子邮件、团队、角色等。因此,在显示文档的 ViewModel 中,我必须调用LoadDocuments
,然后遍历它们并调用LoadConsumerModified
and LoadConsumerCreated
。它也可以继续下去……在那之后我不得不LoadUserGroups
和LoadUserSupervisor
。它还存在循环循环的风险,其中 aUser
有一个Groups[]
属性,而 aGroup
有一个Users[]
属性
选项 C
到目前为止我最喜欢的选择...创建两种访问属性的方法。一个同步和一个异步。将对 Async 属性进行绑定,并且任何代码都将使用 Sync 属性。
好:数据根据需要异步加载 - 正是我想要的。也没有太多额外的编码,因为我需要做的就是修改 T4 模板以生成这些额外的属性/方法。
不好:有两种方法来访问相同的数据似乎效率低下且令人困惑。您需要记住何时应该使用Consumer.ConsumerDocumentsAsync
而不是Consumer.ConsumerDocumentsSync
. WCF 服务调用也有可能多次运行,这需要为每个导航属性添加一个额外的 IsLoaded 属性,例如 IsConsumerDocumentsLoaded。
选项 D
跳过异步加载,只需在设置器中同步加载所有内容。
好:很简单,不需要额外的工作
不好:数据加载时会锁定 UI。不想要这个。
选项 E
让某人告诉我还有另一种方法可以做到这一点并指出我的代码示例:)
其他注意事项
一些 NavigationProperties 将在将对象返回给客户端之前加载到 WCF 服务器上,但是其他的太昂贵而无法使用。
除了在选项 C 中手动调用 Load 事件之外,这些都可以通过 T4 模板完成,因此我几乎不需要编写代码。我所要做的就是在客户端存储库中连接 LazyLoad 事件并将其指向正确的服务调用。
c# - 插入或更新时实体框架 4 InvalidOperationException
我使用 SelfTracking 实体,一切正常,直到我们在参考详细信息表中添加了一些字段。我不知道引用外键有什么问题!我还没有设计数据库模式,但我可以看到一切看起来都不错!
这是堆栈跟踪的异常消息。
这是我第一次面对这种错误。任何帮助表示赞赏。
谢谢你。
c# - N 层应用程序上的实体框架自我跟踪实体
这是一个通用的架构问题,希望对那些已经在最终应用程序中使用 EF 的人来说。
我们有一个典型的 N 层应用程序:
- WPF 客户端
- WCF 服务
- EF STE DTO
- EF 数据层
应用程序在加载期间(在用户登录的同时)加载所有已知的业务类型,然后按需加载一个非常大的“工作批次”,这个批次大约为 4-8Mg,由超过 1000 个业务对象组成。当我们完成加载这个“批处理”时,我们会将所有内容与之前加载的业务类型等链接起来……
最后,我们在内存中有大约 2K-5K 的业务对象都正确引用,因此我们可以在客户端使用和滥用 LINQ,我们还在客户端对所有这些对象进行了一些复杂的数学运算,所以我们真的需要大图.
当我们想要保存对数据库的更改时,问题就来了。有了这么大的对象图,我们几乎不想通过网络再次发送所有内容。
鉴于目前 T4 模板的复杂性,我不喜欢我们当前的方法是在更新时分离和附加所有内容。我们基本上想要更新一个给定的对象,将它与图的其余部分分离,通过网络发送它,在 WCF 端更新它,然后在客户端再次重新附加它。主要问题是当您想要更新链接对象时,假设您添加了一些对也添加的东西有引用的东西,然后是对修改过的东西的另一个引用,等等。这迫使很多客户端代码确保我们不这样做'不要破坏任何东西。
所有这些都是通过生成的代码完成的,所以我们谈论的是每个模板 200-800 行 T4 代码。
我现在正在研究的是一种自定义 STE 的序列化和反序列化的方法,这样我就可以控制通过网络发送的内容,并且能够更新批次而不是仅仅更新单个 STE。检查引用,查看这些引用是否未更改;如果不是,则不要序列化,如果是,则只需将其附加到 WCF 端的上下文即可序列化和更新所有内容。
经过一番研究,我找到了这种方法的两种解决方案。
一种是编写自定义 DataContractSerializer。
第二个是通过更改由 EF 创建的 STE 模板并使用 KnownTypeAttribute,而不是为每个引用类型生成它,让它引用一个检查对象的方法,并且只标记未更改的序列化引用。
- 有没有人遇到过这个问题?
- 您使用了哪些解决方案?
- 你遇到了哪些问题?
- 维护创建的模板有多容易?
repository-pattern - 在 EF 4.1 上使用 ObjectContext 与 DbContext 的存储库实现之间的区别
对于 STE 有什么更好的实现,我听说 DbContext 是使用 EF 实现 Repo 的最简单方法,我个人利用了 EntityState,但是 ObjectContext 上有任何成员可以为我的 CRUD 操作提供更多功能使用回购?今天我正在使用像这样的 GenericRepository :
我忘了提到我也在使用 Unity,所以对 Repository 的调用是这样的:
entity-framework-4 - 实体框架 4 POCO 自我跟踪
嗨,我正在使用 EF 4 开发一个项目。我正在尝试实施 POCO 自我跟踪,我需要实施 wcf 服务吗?我在修改实体时遇到问题,因为更改没有保存到数据库中。
提前致谢。
self-tracking-entities - 使用 STE 在子对象中启用更改跟踪
我正在使用 STE,我想启用对象及其子对象的更改跟踪。我现在要做的就是这样。
我正在寻找的是一种自动启用对子对象的更改跟踪的方法,而不必遍历每个对象并明确告诉它开始跟踪更改。
提前感谢您的任何见解。
.net - 如何停止自我跟踪实体执行添加而不是更新
提前为这个问题的长度道歉!
我有一个数据结构,从中创建了以下实体数据模型(表/字段重命名并简化了以便于理解!):
PaymentMethod
/ProductPaymentMethod
结构的存在是因为 aCustomer
可以有多个PaymentMethods
可用的,但可以从它们中选择要使用的每个Product
。
,和都是基于 so 生成的,CustomerReference
所以必须在初始保存后更新。ProductReference
VendorReference
CustomerId
ProductPaymentMethods
需要PaymentMethodIds
so必须在初始Save之后添加。
已ADO.NET Self-Tracking Entity Generator
运行以生成自跟踪上下文和对象类。
我CreateCustomer
在 BLL 中有一个方法,它生成一个新实体,如下所示(伪代码):
newCustomer
然后将其传递给CreateCustomer
执行此操作的 DAL 中的方法:
返回值分配给Customer
BLL 中的新对象,并从 生成的引用CustomerId
并添加:
该savedCustomer.PaymentMethod
集合循环通过以List<ProductPaymentMethod> productPaymentMethods
使用PaymentMethodIds
. 然后添加:
newCustomer
然后将其传递给UpdateCustomer
执行此操作的 DAL 中的方法:
然后将其返回到表示层
这导致已创建然后更新的所有内容的重复 - 我最终会得到 2 x Customer
、 2 x Product
、 2 x Vendor
、 4 x PaymentMethod
、 4 xCurrency
和 4 xFrequency
记录 -UpdateCustomer
正在接收标记为的实体Added
因此,经过一番研究,我在调用之前添加了以下内容UpdateCustomer
:
这停止了重复Customer
,但我仍然被重复,Product
并记录。Vendor
Currency
Frequency
PaymentMethod
我想出的解决方案是遍历每个集合,并在调用之前将每个实体标记为未更改UpdateCustomer
:
Customer.PaymentMethods
(对和重复Customer.Products.First().Frequencies
)
我现在没有重复,并且我的所有数据都已创建。
最后,关于我的问题!
我不禁觉得我在这里遗漏了一些东西。在每次更新之前,我是否真的必须检查关系树的每个部分并根据需要标记为已修改或未更改(Microsoft 中的术语混合!)?
我认为“自我跟踪”一词意味着所有这些都应该自动处理。
这是使用 EF / STE 的正确方法还是有更好的方法?
编辑:关于我的 Visual Studio 解决方案的更多信息。
DAL 项目 - CustomerModel.edmx、CustomerModel.Context.tt 和 CustomerDAL.cs
模型项目 - CustomerModel.tt
BLL 项目 - CustomerBLL.cs
WCF 项目 - CustomerWCF.svc.cs
测试项目 CustomerTest.cs
CustomerTest.cs 使用 Private Accessor 调用 CustomerWCF.svc.cs
CustomerWCF.svc.cs 调用 CustomerBLL.cs
CustomerBLL.cs 调用 CustomerDAL.cs
DAL 参考模型
BLL 参考 DAL 和模型
服务参考 BLL 和模型
测试参考服务、BLL 和模型
我应该针对 ServiceReference 而不是 PrivateAccessor 进行测试吗?
entity-framework-4 - 实体框架和自我跟踪实体与 POCO
如果我想使用实体框架 4 作为我的数据层,并且想通过 WCF 或其他机制将我的实体发送到另一层,然后希望能够更新实体并将它们发送回去以进行更新/删除/插入最好使用自跟踪实体还是 poco 对象?
如果可能,我宁愿使用 POCO 对象,因为如果可能的话,我不想依赖其他层中的实体框架,但我不知道将 POCO 重新连接到上下文有多么困难。