![](/img/trans.png)
[英]How Do I Use OnModelCreating Inside the Model itself in Entity Framework Core 2.0?
[英]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.