我有两个应用: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