C# efcore有两个dbcontext。如何指定表?
我在数据库中有两个C# efcore有两个dbcontext。如何指定表?,c#,entity-framework,.net-core,entity-framework-core,C#,Entity Framework,.net Core,Entity Framework Core,我在数据库中有两个DbContexts,希望其中一个只引用一个表(类): 在ApplicationDbContext中,只有一个数据库集: public DbSet<Models.User> Users { get; set; } 公共数据库集用户{get;set;} 但它仍将迁移其他表 我如何做到这一点呢?您的问题在于使用两个而不是一个 dotnet ef迁移添加了Mall20200325-context应用程序dbcontext您的问题比使用两个(而不是一个)更严重 dotn
DbContext
s,希望其中一个只引用一个表(类):
在ApplicationDbContext
中,只有一个数据库集:
public DbSet<Models.User> Users { get; set; }
公共数据库集用户{get;set;}
但它仍将迁移其他表
我如何做到这一点呢?您的问题在于使用两个而不是一个
dotnet ef迁移添加了Mall20200325-context应用程序dbcontext您的问题比使用两个(而不是一个)更严重
dotnet ef迁移添加Mall20200325-context应用程序dbcontext我从中找到了以下解决方案。假设您有
AccountDbContext
和ApplicationDbContext
上下文。假设在AccountDbContext
中定义了实体Account
,我们希望将accounts
表从迁移中排除,而在用户
实体中有对它的引用。因此:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// Ignored table `accounts` from other DbContext in the migration
modelBuilder.Entity<Account>(entity => {
entity.ToView("accounts");
// If the `acoounts` table has some columns you must introduce their
// names like this (if the properties' names are different from columns' names)
entity.Property(e => e.Id)
.HasColumnName("id");
entity.Property(e => e.FirstName)
.HasColumnName("first_name");
entity.Property(e => e.LastName)
.HasColumnName("last_name");
});
// Define the table `users`
modelBuilder.Entity<User>(entity => {
entity.ToTable("users");
entity.HasIndex(e => e.Id)
.HasName("users_account_id_foreign");
entity.Property(e => e.Id)
.HasColumnName("id")
.HasColumnType("bigint(20) unsigned");
entity.HasOne(d => d.Account)
.WithOne(p => p.Users)
.HasForeignKey<User>(d => d.Id)
.HasConstraintName("users_account_id_foreign");
});
}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
//在迁移中忽略了来自其他DbContext的表“accounts”
modelBuilder.Entity(Entity=>{
实体。ToView(“账户”);
//如果“accounts”表有一些列,则必须介绍它们的
//这样的名称(如果属性的名称与列的名称不同)
entity.Property(e=>e.Id)
.姓名(“id”);
entity.Property(e=>e.FirstName)
.HasColumnName(“名字”);
entity.Property(e=>e.LastName)
.HasColumnName(“姓氏”);
});
//定义“用户”表`
modelBuilder.Entity(Entity=>{
实体。可转让(“用户”);
entity.HasIndex(e=>e.Id)
.HasName(“用户、帐户、id、国外”);
entity.Property(e=>e.Id)
.HasColumnName(“id”)
.HasColumnType(“bigint(20)unsigned”);
entity.HasOne(d=>d.Account)
.WithOne(p=>p.Users)
.HasForeignKey(d=>d.Id)
.hassConstraintName(“用户\帐户\ id \外国”);
});
}
我从中找到了以下解决方案。假设您有AccountDbContext
和ApplicationDbContext
上下文。假设在AccountDbContext
中定义了实体Account
,我们希望将accounts
表从迁移中排除,而在用户
实体中有对它的引用。因此:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// Ignored table `accounts` from other DbContext in the migration
modelBuilder.Entity<Account>(entity => {
entity.ToView("accounts");
// If the `acoounts` table has some columns you must introduce their
// names like this (if the properties' names are different from columns' names)
entity.Property(e => e.Id)
.HasColumnName("id");
entity.Property(e => e.FirstName)
.HasColumnName("first_name");
entity.Property(e => e.LastName)
.HasColumnName("last_name");
});
// Define the table `users`
modelBuilder.Entity<User>(entity => {
entity.ToTable("users");
entity.HasIndex(e => e.Id)
.HasName("users_account_id_foreign");
entity.Property(e => e.Id)
.HasColumnName("id")
.HasColumnType("bigint(20) unsigned");
entity.HasOne(d => d.Account)
.WithOne(p => p.Users)
.HasForeignKey<User>(d => d.Id)
.HasConstraintName("users_account_id_foreign");
});
}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
//在迁移中忽略了来自其他DbContext的表“accounts”
modelBuilder.Entity(Entity=>{
实体。ToView(“账户”);
//如果“accounts”表有一些列,则必须介绍它们的
//这样的名称(如果属性的名称与列的名称不同)
entity.Property(e=>e.Id)
.姓名(“id”);
entity.Property(e=>e.FirstName)
.HasColumnName(“名字”);
entity.Property(e=>e.LastName)
.HasColumnName(“姓氏”);
});
//定义“用户”表`
modelBuilder.Entity(Entity=>{
实体。可转让(“用户”);
entity.HasIndex(e=>e.Id)
.HasName(“用户、帐户、id、国外”);
entity.Property(e=>e.Id)
.HasColumnName(“id”)
.HasColumnType(“bigint(20)unsigned”);
entity.HasOne(d=>d.Account)
.WithOne(p=>p.Users)
.HasForeignKey(d=>d.Id)
.hassConstraintName(“用户\帐户\ id \外国”);
});
}
添加迁移过程比较两个IModel
实例,一个来自上下文的OnModelCreating
实例,另一个编译到程序集中并从imiglationassembly
服务加载
迁移程序集实现应只考虑模型快照和迁移,使用匹配的<代码> DbCutExtActEng/<代码> < /P>
如果您看到的迁移操作出乎意料,那么在创建两个上下文之前,我想知道您的项目是什么样子的。您是否有一个生成的
modelsnashot
,其属性不匹配[DbContext]
吗?添加迁移过程比较两个IModel
实例,一个来自您的上下文的OnModelCreating
另一个编译到程序集中并从imigrationassembly
服务加载
迁移程序集实现应只考虑模型快照和迁移,使用匹配的<代码> DbCutExtActEng/<代码> < /P>
如果您看到的迁移操作出乎意料,那么在创建两个上下文之前,我想知道您的项目是什么样子的。您是否有一个生成的
ModelSnapshot
,其[DbContext]
属性不匹配?您能说明您在寻找什么吗?我是否理解您想要两个单独的DBContext,每个都映射到一个单独的表?但是您想确保其他表仍然作为迁移的一部分创建,即使它们没有映射到DbContext?(我很可能是误会了,我只是推测一下。)@JeremyCaney谢谢。我希望DbContext中未映射的表不会被迁移。如果我使用dotnete ef迁移,请添加xxx---conntext ApplicationDbContext。。某些未在ApplicationDbContext中映射的表也已迁移。但它们被映射到另一个DbContext中。我希望这些表是分开的。如果在用户中有其他实体作为导航属性,则它们由datacontext间接映射。您必须选择这些字段或将它们包含在您的上下文中。@MatJ。不,用户仅映射到ApplicationDbContext中。其他表(如Orders)位于另一个DbContext中。但是,当我迁移ApplicationDbContext时,它还将迁移其他表(包括Orders)