c# - 首先在实体框架代码中禁用列
问题描述
我正在使用实体框架将数据插入到 2 个不同的数据库中。在一个数据库中存在一些列,但在另一个数据库中不存在。它们的数据类型不可为空(int 和 float)。
我不在我的代码中使用这些列(当它们存在时)。这意味着我只插入 0 作为它们的数据,但我显然不能发送 null 。
有没有办法让我轻松插入数据,而无需为此创建 2 个不同版本的应用程序?理想情况下,我希望只有一个模型,其属性类似于在此列中插入 0(如果可用)。
解决方案
如果您的应用程序仅针对一个数据库运行,那么您可以在 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);
}
}
推荐阅读
- c - cast 和 mask 的区别
- git - git - 使用来自裸仓库的远程分支
- python - Pandas 根据时间戳删除行
- python - 我想在 tkinter 中做一个随机数猜谜游戏
- c# - C# 等效于 powershell get-childitem -recurse,同时省略某些文件夹
- simulation - 如何在 LBM 中添加或删除流体(格子 Boltzmann 方法)
- c++ - 如何使用复制构造器来输出我的变量?
- android - 带有斜线段自定义视图的水平进度条Android
- android - 未显示正确的应用程序包名称的广告
- r - 通过对连续行求和直到 0 进行分组