c# - 无法在单独的项目中使用 DbModelBuilder

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

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

我正忙于设置 Entity Framework ,并在我的上下文类中,而不必在

中编写所有流畅的 API 代码
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 添加到我的引用中,它也不起作用。我还需要将 Entity Framework 安装到这个单独的项目中才能正常工作。

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

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

谢谢

最佳答案

既然你问了,这是我的 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());
}

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

关于c# - 无法在单独的项目中使用 DbModelBuilder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36141356/

相关文章:

c# - 更新数据库 n :n

C# ASP.Net Core 与 Autofac 集成时面临的问题

c# - ActionResult 返回一个 Stream

c# - 头像显示 Visual Studio 更改查询

c# - 在 C# 中覆盖 Json 属性名称

c# - 如何处理IIS回收

.NET 4 加载不同于 .NET 3.5 的程序集

c# - 如何在 Windows Phone 8.1 中获取屏幕分辨率(宽度和高度)?

javascript - 将 Blob 字符串 URL 转换为 Blob,然后转换为 base64

c# - 将模型属性作为参数传递给 Url.Action