相关疑难解决方法(0)

代码优先与模型/数据库优先

使用实体框架4.1代码优先于模型/数据库优先使用EDMX图表有什么优缺点?

我正在尝试完全理解使用EF 4.1构建数据访问层的所有方法.我正在使用Repository模式和IoC.

我知道我可以使用代码优先方法:手动定义我的实体和上下文并用于ModelBuilder微调模式.

我还可以创建一个EDMX图表并选择一个代码生成步骤,该步骤使用T4模板生成相同的POCO类.

在这两种情况下,我最终POCO都得到了ORM不可知的对象和源自的上下文DbContext.

数据库优先似乎最吸引人,因为我可以在企业管理器中设计数据库,快速同步模型并使用设计器对其进行微调.

那么这两种方法有什么区别?是仅仅关于VS2010与企业管理器的偏好?

entity-framework poco ef-code-first entity-framework-4.1 ef-database-first

607
推荐指数
9
解决办法
29万
查看次数

如何模拟EntityFramework的IQueryable实现的局限性

我目前正在为MVC4应用程序中的存储库实现编写单元测试.为了模拟数据上下文,我开始采用这篇文章中的一些想法,但我现在发现了一些限制,让我怀疑是否有可能正确模拟IQueryable.

特别是,我已经看到了一些测试通过但代码在生产中失败的情况,并且我无法找到任何方法来模拟导致此失败的行为.

例如,以下代码段用于选择Post属于预定义类别列表的实体:

var posts = repository.GetEntities<Post>(); // Returns IQueryable<Post>
var categories = GetCategoriesInGroup("Post"); // Returns a fixed list of type Category
var filtered = posts.Where(p => categories.Any(c => c.Name == p.Category)).ToList();
Run Code Online (Sandbox Code Playgroud)

在我的测试环境中,我试图嘲弄posts使用假DbSet上面提到的实施,同时也通过创建ListPost实例并将其转换为IQueryable使用AsQueryable()扩展方法.这两种方法都在测试条件下工作,但代码实际上在生产中失败,但有以下例外:

System.NotSupportedException : Unable to create a constant value of type 'Category'. Only primitive types or enumeration types are supported in this context.

虽然像这样的LINQ问题很容易解决,但真正的挑战是找到它们,因为它们不会在测试环境中显示出来.

我期望我可以嘲笑实体框架的实施行为,这是不现实的IQueryable吗?

谢谢你的想法,

蒂姆.

entity-framework iqueryable mocking

28
推荐指数
1
解决办法
5834
查看次数

如何将同一列添加到EF Core中的所有实体?

想象一下,我想向所有实体添加一个IsDeleted列或一些审核列。我可以创建一个基类,所有实体都将从该基类继承,这将解决我的问题,但是我无法指定创建列的顺序,因此我将以所有审计字段结束,然后才是实体字段,我不想要。我希望他们在桌子的尽头。

在实体框架的标准版本中,我们可以通过使用指定列顺序的注释来做到这一点。但是,目前对于EF核心还不存在这种情况。

我可以使用OnModelCreating()方法上的流利api来做到这一点,问题在于我只知道如何为我的每个实体单独进行操作,这意味着我必须为我拥有的每个实体编写相同的代码。

有什么办法可以为我所有的实体通用吗?某种for循环遍历我在dbcontext的DbSet中注册的所有实体?

c# entity-framework entity-framework-core .net-core

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