一个是只读的上下文之间的关系?



我有两个应用:A和b。

A有一个实体:

public class Country
{
public string Code;
public string Name;
}

和B有一个实体

public class Travel
{
public string Title;
public virtual ICollection<Country> Countries;
}

我只能更改应用程序b。我已经将实体从A复制到b。这就是上下文的定义方式:

ApplicationAContext:

public class ApplicationAContext : DbContext
{
public virtual DbSet<Country> Country;
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Country>().ToTable(nameof(Country), t => t.ExcludeFromMigrations());
}
}

ApplicationBContext:

public class ApplicationBContext : DbContext
{
public virtual DbSet<Travel> travel;
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Country>().ToTable(nameof(Country), t => t.ExcludeFromMigrations());
}
}

哪些是有效的方式:

  • 查询
  • 迁移

  • 跨上下文映射(如果我加载一个Travel类型的对象,我可以毫无问题地访问国家)

不工作的地方:

Travel travel = new Travel();
travel.Countries = _applicationAContext.Country.AsNoTracking().Where(c => c.Code.Contains("A"));
travel.Title = "Foobar";
_applicationBContext.Travel.Add(travel);
_applicationBContext.SaveChanges();

尽管使用了AsNoTracking(),应用程序仍然尝试更新国家。在我们的开发环境之外,这将失败,因为应用程序用户只有对ApplicationA表的读访问权。

我已经尝试在ApplicationBContext中使用modelBuilder.Ignore(),但这会删除数据库中的所有关系表和外键包含。

我理解这种关系是双向存在的,这意味着Country也有一个Travel实体列表,但它永远不会被利用或访问。

附加信息:

应用程序A和B共享一个数据库,但是B对A的表只有读访问权限。

使用表拆分解决https://learn.microsoft.com/en-us/ef/core/modeling/table-splitting

最新更新