簡體   English   中英

如何填寫 OnModelCreating 中被忽略的字段?

[英]How do I fill in an ignored field inside OnModelCreating?

我在兩個 DbContext 中使用相同的實體。

public class ActualDbContext : DbContext
{
    public DbSet<Doc> Docs { get; set; }
}

public class ArchivedDbContext : DbContext
{
    public DbSet<Doc> Docs { get; set; }
}

public class Doc
{
    ...
}

如何向該實體添加一個被忽略的字段,但從 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);        // ??
        };
    }
}

從數據庫中讀取數據時,必須填寫此屬性。在程序代碼中,我想避免重復代碼。 我需要以同樣的方式處理這些實體。 除了這個屬性。 我怎樣才能做到這一點 ?

@ali 你的意思是這樣的嗎?

class MyRepo: IRepo
{
    private bool _isArchived;

    public MyRepo (MyContext context, bool isArchived)
    {
        _context = context;
       _isArchived = isArchived;
    }

    public IQueryable<Doc> GetData (...)
    {
        return _mainDbContext.Docs.Where(....)
            .Select (x=> new Doc 
            {
                Id = x.Id,
                IsArchived = _isArchived 
            });
    }

}

我真的不喜歡這個決定。

基於ef核心架構,不可能做這樣的事情。 我建議使用存儲庫模式並在獲取數據時為您的實體設置默認值。

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; }
}

檢查此答案以獲取更多解釋 => ignoring-a-class-property-in-entity

美好的一天🙂

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM