C# 如何在OnModelCreating中填写一个被忽略的字段?
我在两个DBContext中使用相同的实体 公共类ActualDbContext:DbContext { 公共数据库集文档{get;set;} } 公共类ArchivedDbContext:DbContext { 公共数据库集文档{get;set;} } 公共类文件 { ... } 如何将忽略的字段添加到此实体,但从DbContext填充它C# 如何在OnModelCreating中填写一个被忽略的字段?,c#,entity-framework,entity-framework-core,ef-core-3.1,C#,Entity Framework,Entity Framework Core,Ef Core 3.1,我在两个DBContext中使用相同的实体 公共类ActualDbContext:DbContext { 公共数据库集文档{get;set;} } 公共类ArchivedDbContext:DbContext { 公共数据库集文档{get;set;} } 公共类文件 { ... } 如何将忽略的字段添加到此实体,但从DbContext填充它 public class Doc { ... public bool IsArchived {get;set;} } public cla
public class Doc
{
...
public bool IsArchived {get;set;}
}
public class ActualDbContext : DbContext
{
protected override void OnModelCreating(ModelBuilder builder)
{
builder.Entity<Doc>(entity =>
{
entity
.Ignore(x => x.IsArchived)
.WithValue(x => false); // ??
};
}
}
public class ArchivedDbContext : DbContext
{
protected override void OnModelCreating(ModelBuilder builder)
{
builder.Entity<Doc>(entity =>
{
entity
.Ignore(x => x.IsArchived)
.WithValue(x => true); // ??
};
}
}
从数据库读取数据时,必须填写此属性。
在程序代码中,我希望避免重复代码。我需要以同样的方式与这些实体合作。除了这个财产。我该怎么做
@阿里,你是说什么
我真的不喜欢这个决定。基于ef核心架构,不可能做到这一点。 我建议使用repository模式,并在获取数据时为实体设置默认值
Class MyRepo: IRepo
{
private ActualDbContext _mainDbContext;
private ArchivedDbContext _archivedContext;
public MyRepo (ActualDbContext context , ArchivedDbContext archivedContext)
{
_mainDbContext = context;
_archivedContext = archivedContext;
}
public IQueryable<Doc> GetMainData (...)
{
return _mainDbContext.Docs.Where(....)
.Select (x=> new Doc
{
Id = x.Id,
IsArchived = false
});
}
public IQueryable<Doc> GetArchivedData (...)
{
return _archivedContext.Docs.Where(....)
.Select (x=> new Doc
{
Id = x.Id,
IsArchived = true
});
}
}
基于ef核心架构,这是不可能做到的。 我建议使用repository模式,并在获取数据时为实体设置默认值
Class MyRepo: IRepo
{
private ActualDbContext _mainDbContext;
private ArchivedDbContext _archivedContext;
public MyRepo (ActualDbContext context , ArchivedDbContext archivedContext)
{
_mainDbContext = context;
_archivedContext = archivedContext;
}
public IQueryable<Doc> GetMainData (...)
{
return _mainDbContext.Docs.Where(....)
.Select (x=> new Doc
{
Id = x.Id,
IsArchived = false
});
}
public IQueryable<Doc> GetArchivedData (...)
{
return _archivedContext.Docs.Where(....)
.Select (x=> new Doc
{
Id = x.Id,
IsArchived = true
});
}
}
因此,可以通过将onmodelcreating重写为其基类来实现这一点
public class ActualDbContext : DbContext
{
public ActualDbContext (DbContextOptions<ActualDbContext > options) : base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Doc>().Ignore(t => t.IsArchived);
base.OnModelCreating(modelBuilder);
}
public DbSet<Doc> Docs { get; set; }
}
检查此答案以了解更多解释=>
Good Day因此,您可以通过将onmodelcreating重写为其基类来实现这一点
public class ActualDbContext : DbContext
{
public ActualDbContext (DbContextOptions<ActualDbContext > options) : base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Doc>().Ignore(t => t.IsArchived);
base.OnModelCreating(modelBuilder);
}
public DbSet<Doc> Docs { get; set; }
}
检查此答案以了解更多解释=>
你好,我的问题是关于别的。不是关于如何配置被忽略的字段。这是关于如何在上下文中填充它。我对你的问题感到困惑。如果你想在某个属性中填充你想要的值,为什么要忽略它?如果你忽略了它,你用什么填充它重要吗。当您从db获取值时,它将不起作用。对吗?在程序代码中,我处理归档和当前文档的方式相同,只是有几行不同。我需要显示记录是存档的还是实际的。好的,那么你想显示你所有的文档都是存档状态是真的吗?请帮助我了解您想要显示的内容以及您当前的数据库状态。我的问题是关于其他内容的。不是关于如何配置被忽略的字段。这是关于如何在上下文中填充它。我对你的问题感到困惑。如果你想在某个属性中填充你想要的值,为什么要忽略它?如果你忽略了它,你用什么填充它重要吗。当您从db获取值时,它将不起作用。对吗?在程序代码中,我处理归档和当前文档的方式相同,只是有几行不同。我需要显示记录是存档的还是实际的。好的,那么你想显示你所有的文档都是存档状态是真的吗?请帮助我了解您想要显示的内容以及您当前的数据库状态。您可以像这样使用repositoy模式。它使您的代码更干净。您可以像这样使用repositoy模式。它使你的代码更干净。