实体不能被多个上下文跟踪,干扰N层设计

时间:2016-11-29 12:20:00

标签: c# entity-framework

我有一位同事坚持使用n层数据访问层和MVVM开发ASP.Net MVC网站。

他有Silverlight和WPF的背景,我试图创建一个解决方案,但它会导致问题。

我创建了DAL和逻辑层(使用泛型):

Dal - 包含一个包装实体框架工作的存储库模式。 逻辑 - 传递层,当前没有通用的逻辑。

我仍在使用MVC模式并将实体框架模型传递给View,除非需要其他属性或方法 - 在这种情况下,我创建了一个视图模型和一个在两者之间进行映射的接口。

n层数据访问层已将实体框架上下文锁定在堆栈的底部,而我遇到的主要问题是不能在多个上下文中跟踪实体。 ({" IEntityChangeTracker的多个实例无法引用实体对象。"})

我最近遇到了一个问题,即尽管我尝试使用模型,接口,深度复制,但上下文出现此错误。

这里的问题是,这是我将尝试将模型放入DAL层并在实体框架实体和模型之间映射数据的方法。

我理解潜在的问题:即使您处理了一个上下文,它也不会释放附加到它的实体。反正有没有让这种轮胎数据访问方法与MVC一起工作?或者我是对的,这将永远不会工作,我应该坚持使用控制器方法中的实体框架上下文(或使用依赖注入实现的底层类)。

1 个答案:

答案 0 :(得分:2)

这里要解开很多东西。

  1. 如果您正在寻找MVVM实现,那么您将需要查看类似knockout.js的内容。或者其他一些框架将在客户端进行声明性数据绑定。你可以阅读一些文章来理解这一点。
  2. https://docs.microsoft.com/en-us/aspnet/core/client-side/knockout

    但让我们假设您不会走这条路并且想要坚持使用MVC。

    1. 我会停止将实体传递给您的观点。你会让自己无尽的悲伤。为每个相应的视图创建视图模型。你使用的界面看起来有点矫枉过正。您可以将实体/ repos的linq查询投影到视图模型中。您还可以使用Automapper之类的东西从实体映射到视图模型。将一些代码附加到问题可能会有所帮助。我的视图模型往往非常扁平。我不明白为什么你需要对视图执行实体树的深层复制。可以使用部分视图或其他方法获得后者 现在您没有将实体发送到视图,当您发布要更新的信息时,您将不得不实例化一个新对象,以便再次从ef获取要更新的对象。进行更改并保存。

    2. 对我而言,最简单的实施是最好的。我会将上下文传递给控制器​​方法(最好使用IoC)并在控制器操作中直接查询上下文并直接投影到视图模型中。如果您在控制器操作之间有很多共享代码,可能会将内容移动到服务中,然后将服务注入控制器并将上下文注入服务。但我首先将上下文注入控制器。