1

我的应用程序的架构结构如下:

用户界面(客户端)

用户界面 (XAML)

虚拟机(客户端)

所有视图模型的层。该层与来自服务层的 DTO 一起使用。

服务(服务器端)

客户端的通信接口。客户端使用此服务层的 DTO。该层执行从 DTO 到 EF-Entities(并返回)的转换。我使用自动映射器进行转换。

域(服务器端)

整个业务逻辑分为几个领域。该层与实体框架中的实体一起工作。

数据访问(服务器端):

数据访问层与 EF 一起工作。该层采用存储库/工作单元模式设计。

我的问题:创建新记录效果很好。但是如果我想更新记录,EF 不知道更新。它总是想创造一个新的记录。我认为,问题在于 EF 与整个变更跟踪机制的引用一起工作。自动映射器将始终创建新记录。它是否正确?

有没有其他选择?

提前致谢。

亲切的问候,亲

编辑:我的问题总结:

EF 在我的 n 层架构中不会更新,它总是想创建一条新记录。

我希望这会有所帮助。

4

3 回答 3

1

您需要根据实体的特征在业务层中做出决定。如果您的实体有一个 ID,那么它必须已经存在,因此您应该使用

context.YourEntities.Attach(entity);
context.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified);

但如果没有,那么它是新的,你可以使用

context.YourEntities.AddObject(entity);

然后在两条路径之后,

context.SaveChanges();
于 2012-08-01T09:06:55.377 回答
0

您需要附加实体:

var existingPerson = ctx.Persons.SingleOrDefault(p => p.Name = "Joe Bloggs" };
ctx.Persons.Attach(existingPerson);

查看此答案以获取完整详细信息:Entity Framework 4 - AddObject vs Attach

这里是 MSDN 参考:http: //msdn.microsoft.com/en-us/library/bb896271.aspx

有关上下文生命周期的详细信息,请查看此答案:关于实体框架上下文生命周期的问题

于 2012-07-30T08:35:31.027 回答
0

您需要附加实体,然后将实体状态更改为已修改

于 2012-07-30T08:52:44.093 回答