实体框架两个上下文之间的核心导航属性

时间:2018-03-29 08:51:15

标签: c# entity-framework foreign-keys entity-framework-core

此问题存在类似问题,但EF Core没有。与Entity Framework Core Using multiple DbContexts不重复。该问题与根本无法从第二个上下文访问数据库有关,并且这两个上下文使用不同的数据库。此问题与单个数据库有关,该问题与迁移有关

我有两个使用相同SQL Server数据库的EF核心数据库上下文。

在第一个上下文中,我有很多实体,其中一个是User。

在第二个实体中,有一个名为UserExt的实体,它具有User

的导航属性
public class UserExt
{
    [Key]
    public long UserID { get; set; }
    public virtual User User { get; set; }

    [Required]
    public string Address { get; set; }
}

问题是,在使用“添加迁移”为UserExt创建迁移时,还会包含第一个上下文中的所有实体。

尝试提供上下文,但结果相同

add-migration --context SecondContext

使用EF 6可以使用ContextKey(https://msdn.microsoft.com/en-us/library/system.data.entity.migrations.dbmigrationsconfiguration.contextkey(v=vs.113).aspx)解决此问题,但尚未移植到EF Core

有没有办法让这项工作成功,以便第二个上下文中的迁移只包含其实体?

1 个答案:

答案 0 :(得分:0)

使用数据库上下文继承解决。这样,我可以进行单独的迁移。

public class SecondDbContext : FirstDbContext
{
    public virtual DbSet<UserExt> ExtendedUsers { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
       optionsBuilder.UseSqlServer("connectionString", options => 
            options
               .MigrationsAssembly("SecondDbContextAssemblyName")
               .MigrationsHistoryTable("__SecondEFMigrationsHistory") // separate table to store migration history to avoid conflicts
       );
    } 
}

由于SecondDbContext是从FirstDbContext继承的,因此在基本上下文中进行的每个实体更改都将被继承。这意味着将新迁移添加到第二个上下文时,它将尝试再次应用第一个上下文中的更改。解决方法是:

  • 添加新迁移(例如Add-Migration Inherit_FirstDbContext
  • 从迁移的UpDown方法中删除所有内容
  • 在数据库中应用空迁移。 (Update-Database

这确保了Entity Framework快照将包含更改,而无需实际将它们重新应用到数据库中。