【问题标题】:Cannot use DbModelBuilder in separate project不能在单独的项目中使用 DbModelBuilder
【发布时间】:2016-03-21 20:52:07
【问题描述】:

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

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

protected override void OnModelCreating(DbModelBuilder modelBuilder) 

方法,我希望能够在我的Model 类中创建一个名为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 引用。即使我将System.Data.Entity dll 添加到我的引用中,它也不起作用。我还需要将实体框架安装到这个单独的项目中才能正常工作。

当然,我不必将 EF 添加到我想使用 DbModelBuilder 的每个项目中吗?

还有什么方法可以做到这一点?

谢谢

【问题讨论】:

  • 您是否引用了正确的 .Net 版本?顺便说一句,使用 NuGet 会容易得多。只需将包添加到您的项目中。但是...不应该在 EF 程序集中进行配置,这样您就可以将类程序集与 EF 解耦吗?
  • @GertArnold 我的解决方案中有一个名为 Common 的项目,其中放置了将在整个项目中使用的所有模型。由于这些模型将映射到我的表,我想在它们内部进行配置。您建议我在哪里进行所有必要的配置?
  • 我不知道,不知道你的项目。但我不喜欢多个库都依赖于 EF 的想法。也许一个映射程序集完成所有映射?
  • @GertArnold 感谢您的想法。如果我理解正确,您是否认为,我应该创建一个类,几乎就像程序集中引用 EntityFramework 的“Initialize”类,并在那里完成我的所有映射?

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


【解决方案1】:

这是我的 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());
}

这对我们的团队来说效果很好。您几乎从不看流畅的代码,因此将其排除在我们日常查看的模型之外是一件好事。

【讨论】:

  • 我真的很喜欢这种方法,感谢您的努力和时间。如果我在与“数据访问层”相同的项目中执行此操作,这也意味着我不必将 EntityFramework.dll 添加到另一个项目中,因为它不是真正需要的。再次感谢,非常感谢。
【解决方案2】:

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

我必须将 2 个程序集 EntityFramework.dll 和 EntityFramework.SqlServer.dll 的引用添加到抱怨的项目中,从而解决了问题。

【讨论】:

  • 嗯,你基本上是在告诉我,你遇到了和我一样的问题,你最终通过添加 EnittyFramework.dll 来解决它,这也是我所做的。
猜你喜欢
  • 2010-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-31
相关资源
最近更新 更多