首页 > 解决方案 > 首先在实体框架代码中禁用列

问题描述

我正在使用实体框架将数据插入到 2 个不同的数据库中。在一个数据库中存在一些列,但在另一个数据库中不存在。它们的数据类型不可为空(int 和 float)。

我不在我的代码中使用这些列(当它们存在时)。这意味着我只插入 0 作为它们的数据,但我显然不能发送 null 。

有没有办法让我轻松插入数据,而无需为此创建 2 个不同版本的应用程序?理想情况下,我希望只有一个模型,其属性类似于在此列中插入 0(如果可用)。

标签: c#entity-frameworkef-code-first

解决方案


如果您的应用程序仅针对一个数据库运行,那么您可以在 OnModelCreating 中使用一条 IF 语句,该语句使用 Fluent API 来.Ignore()缺失的属性。

public class MyDbContextWithMissingColumns: MyDbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        if (myConfig.UseDatabaseWithoutSomeProperties)
        {
          modelBuilder.Entity<Foo>().Ignore(f => f.SomeProperty);
        }
        base.OnModelCreating(modelBuilder);
    }
}

如果应用程序的单个实例连接到两个数据库,则必须使用单独的 DbContext 子类型,因为 OnModelCreating 仅针对 AppDomain 中 DbContext 类型的第一个实例运行。

例如:

public class MyDbContextWithMissingColumns: MyDbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Foo>().Ignore(f => f.SomeProperty);
        base.OnModelCreating(modelBuilder);
    }
}

推荐阅读