添加迁移时,另一个具有代码优先的模式中的外键会创建引用表两次
Foreign Keys in another schema with Code-First creates referenced tables twice when adding migration
我会简化我的问题。
我有 2 个模式:address 和 company。他们每个人都有自己的背景。
在 地址 模式中我有这些 classes:
public class Country : GuidIdentifiable
{
public String Name { get; set; }
}
public class City : GuidIdentifiable
{
public Guid Country_ID { get; set; }
public String Name { get; set; }
public Country Country { get; set; }
}
在 company 模式中我有这个 class:
public class Store : GuidIdentifiable
{
public Guid Country_ID { get; set; }
public Guid City_ID { get; set; }
public String Name { get; set; }
public Store Store { get; set; }
public virtual Country Country { get; set; }
public virtual City City { get; set; }
}
当我添加迁移时,address 架构和 company 架构都会添加国家和城市 table。
地址:
CreateTable(
"address.City",
c => new
{
ID = c.Guid(nullable: false),
Country_ID = c.Guid(nullable: false),
Name = c.String(nullable: false, maxLength: 255),
PTT = c.String(nullable: false, maxLength: 255),
})
.PrimaryKey(t => t.ID)
.ForeignKey("address.Country", t => t.Country_ID, cascadeDelete: true)
.Index(t => t.Country_ID);
CreateTable(
"address.Country",
c => new
{
ID = c.Guid(nullable: false),
Name = c.String(nullable: false, maxLength: 255),
})
.PrimaryKey(t => t.ID);
和公司:
CreateTable(
"company.City",
c => new
{
ID = c.Guid(nullable: false),
Country_ID = c.Guid(nullable: false),
Name = c.String(nullable: false, maxLength: 255),
PTT = c.String(nullable: false, maxLength: 255),
})
.PrimaryKey(t => t.ID)
.ForeignKey("company.Country", t => t.Country_ID, cascadeDelete: true)
.Index(t => t.Country_ID);
CreateTable(
"company.Country",
c => new
{
ID = c.Guid(nullable: false),
Name = c.String(nullable: false, maxLength: 255),
})
.PrimaryKey(t => t.ID);
- 我已经尝试添加 数据注释 例如
[Table(nameof(Country), Schema = "address")]
到他们两个,但他们仍然出现在两个迁移中,只是具有相同的模式前缀(地址。)然后你不能用两个迁移更新数据库,因为它告诉你那些 tables 已经存在。
- 我尝试使用 modelBuilder 的 Ignore() 方法 忽略 CompanyDbContext 中的城市和国家。这导致了一个错误,表明 FK 正在引用不存在的东西。
如果第一个模式不创建所引用 table是为了自己吗?
=> 我相当确定它可以完成,因为我已经用数据库优先完成了它。
这里的问题并不像多上下文那样多模式。
我找到的最有用的解决方案是 (#2)。
我有一个完整模型的上下文,我用它来维护数据库,还有多个较小的模型在应用程序内部使用。
我会简化我的问题。 我有 2 个模式:address 和 company。他们每个人都有自己的背景。
在 地址 模式中我有这些 classes:
public class Country : GuidIdentifiable
{
public String Name { get; set; }
}
public class City : GuidIdentifiable
{
public Guid Country_ID { get; set; }
public String Name { get; set; }
public Country Country { get; set; }
}
在 company 模式中我有这个 class:
public class Store : GuidIdentifiable
{
public Guid Country_ID { get; set; }
public Guid City_ID { get; set; }
public String Name { get; set; }
public Store Store { get; set; }
public virtual Country Country { get; set; }
public virtual City City { get; set; }
}
当我添加迁移时,address 架构和 company 架构都会添加国家和城市 table。 地址:
CreateTable(
"address.City",
c => new
{
ID = c.Guid(nullable: false),
Country_ID = c.Guid(nullable: false),
Name = c.String(nullable: false, maxLength: 255),
PTT = c.String(nullable: false, maxLength: 255),
})
.PrimaryKey(t => t.ID)
.ForeignKey("address.Country", t => t.Country_ID, cascadeDelete: true)
.Index(t => t.Country_ID);
CreateTable(
"address.Country",
c => new
{
ID = c.Guid(nullable: false),
Name = c.String(nullable: false, maxLength: 255),
})
.PrimaryKey(t => t.ID);
和公司:
CreateTable(
"company.City",
c => new
{
ID = c.Guid(nullable: false),
Country_ID = c.Guid(nullable: false),
Name = c.String(nullable: false, maxLength: 255),
PTT = c.String(nullable: false, maxLength: 255),
})
.PrimaryKey(t => t.ID)
.ForeignKey("company.Country", t => t.Country_ID, cascadeDelete: true)
.Index(t => t.Country_ID);
CreateTable(
"company.Country",
c => new
{
ID = c.Guid(nullable: false),
Name = c.String(nullable: false, maxLength: 255),
})
.PrimaryKey(t => t.ID);
- 我已经尝试添加 数据注释 例如
[Table(nameof(Country), Schema = "address")]
到他们两个,但他们仍然出现在两个迁移中,只是具有相同的模式前缀(地址。)然后你不能用两个迁移更新数据库,因为它告诉你那些 tables 已经存在。 - 我尝试使用 modelBuilder 的 Ignore() 方法 忽略 CompanyDbContext 中的城市和国家。这导致了一个错误,表明 FK 正在引用不存在的东西。
如果第一个模式不创建所引用 table是为了自己吗?
=> 我相当确定它可以完成,因为我已经用数据库优先完成了它。
这里的问题并不像多上下文那样多模式。
我找到的最有用的解决方案是
我有一个完整模型的上下文,我用它来维护数据库,还有多个较小的模型在应用程序内部使用。