EF / Automapper和n层架构

时间:2012-07-30 08:30:17

标签: c# entity-framework architecture n-layer

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

用户界面(客户端)

用户界面(XAML)

VM(客户端)

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

服务(服务器端)

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

域(服务器端)

整个businesslogic分散在几个领域。该层与实体框架中的实体一起使用。

数据访问(服务器端):

数据访问层与EF一起使用。该层设计有存储库/ unitofwork模式。

我的问题:创建新记录效果很好。但是,如果我想更新记录,EF不知道更新。它总是想创建一个新的记录。我假设,问题是,EF与整个变更跟踪机制的参考一起工作。 automapper将始终创建新记录。这是对的吗?

还有其他选择吗?

提前致谢。

亲切的问候,亲

修改: 我的问题摘要:

EF在我的n层架构中没有更新,它总是想创建一个新的记录。

我希望这会有所帮助。

3 个答案:

答案 0 :(得分:1)

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

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

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

context.YourEntities.AddObject(entity);

然后在两条路径之后,

context.SaveChanges();

答案 1 :(得分: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

有关上下文生命周期的详细信息,请查看以下答案:Questions about Entity Framework Context Lifetime

答案 2 :(得分:0)

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