C# 如何在OnModelCreating中填写一个被忽略的字段?

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

我在两个DBContext中使用相同的实体

公共类ActualDbContext:DbContext { 公共数据库集文档{get;set;} } 公共类ArchivedDbContext:DbContext { 公共数据库集文档{get;set;} } 公共类文件 { ... } 如何将忽略的字段添加到此实体,但从DbContext填充它

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模式。它使你的代码更干净。