不能在单独的项目中使用DbModelBuilder

时间:2016-03-21 20:52:08

标签: c# .net asp.net-mvc entity-framework

在我的解决方案中,我有一些项目,它们共同构成了一个Web应用程序的一部分。

我正在忙于设置实体框架,并且在我的上下文类中,而不是必须在

中编写所有流畅的API代码
protected override void OnModelCreating(DbModelBuilder modelBuilder) 

方法,我希望能够在名为Model的{​​{1}}类中创建一个方法,然后在那里配置所有主键/外键设置,所以它应该如下所示:

ConfigureModel

例如,调用方法如下:

public class UserRolesModel : ModelBase
{
    #region Configuration

    public static void ConfigureModel(DbModelBuilder modelBuilder)
    {
        //necessary code here
    }

    #endregion
}

我遇到的问题是我的protected override void OnModelCreating(DbModelBuilder modelBuilder) { UserRolesModel.ConfigureModel(modelBuilder); } 方法:我似乎无法解析ConfigureModel引用。即使我将DbModelBuilder dll添加到我的引用中,它也不起作用。我需要将Entity Framework安装到这个单独的项目中,以便工作。

当然,我不需要为每个我想使用System.Data.Entity的项目添加EF吗?

实现这一目标的另一种方法是什么?

由于

2 个答案:

答案 0 :(得分:3)

自从你提问以来,这是我的2美分。不要在你的模型中加入流畅的代码 - 关注点分离不好,使它们混乱(非POCO)。这是一个巨大的OnModelCreating的一个很好的替代品:

1)在项目中创建一个文件夹,其中包含您的上下文" EntityConfigurations"。在一个大型项目中,您可以进一步划分它,例如" EntityConfigurations \ System"," EntityConfigurations \ Employee"等等。From Scott Allen

2)为每个项目添加课程:

public class ProductConfiguration : EntityTypeConfiguration<Product>
{
    public ProductConfiguration()
    {
        HasKey(p => p.ProductId);
        Property(p => p.ProductName)
           .IsRequired()
           .HasMaxLength(200);
        ...
    }

}

3)使用AddFromAssembly,您的地图类将被自动发现并运行。 From Julie Lerman.

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);
    Configuration.LazyLoadingEnabled = false;

    modelBuilder.Configurations.AddFromAssembly(Assembly.GetExecutingAssembly());
}

这对我们的团队来说效果很好。你几乎没有看过流利的代码,所以把它放在我们每天看的模型之外是件好事。

答案 1 :(得分:0)

我遇到了类似的问题,我的依赖项目无法解析与EF相关的引用

我不得不将2个程序集的引用,EntityFramework.dll和EntityFramework.SqlServer.dll添加到修复该问题的抱怨的项目中。