EF6 中的关系错误外键已存在
Foreign Key already exists For Relation Error in EF6
我正在使用 Entity Framework 6.4.x 与 Npgsql 和代码优先方法。
我创建了以下实体:
public class UserBankAccountTransaction
{
public long PayerBankAccountId { get; set; }
[ForeignKey(nameof(PayerBankAccountId))]
public virtual UserBankAccount PayerBankAccount { get; set; }
public long PayeeBankAccountId { get; set; }
[ForeignKey(nameof(PayeeBankAccountId))]
public virtual UserBankAccount PayeeBankAccount { get; set; }
[Required]
public int Amount { get; set; }
}
就是这样,现在当我执行 Add-Migration
时,它会创建以下迁移:
CreateTable(
"public.UserBankAccountTransactions",
c => new
{
Id = c.Long(nullable: false, identity: true),
PayerBankAccountId = c.Long(nullable: false),
PayeeBankAccountId = c.Long(nullable: false),
Amount = c.Int(nullable: false),
CreatedDate = c.DateTime(nullable: false),
ModifiedDate = c.DateTime(nullable: false),
})
.PrimaryKey(t => t.Id)
.ForeignKey("public.UserBankAccounts", t => t.PayeeBankAccountId, cascadeDelete: true)
.ForeignKey("public.UserBankAccounts", t => t.PayerBankAccountId, cascadeDelete: true)
.Index(t => t.PayerBankAccountId)
.Index(t => t.PayeeBankAccountId);
正如您在上面自动生成的迁移中看到的那样,"public.UserBankAccounts"
是生成两次同名的外键。
因此当我 Update-Migration
我得到这个错误:
constraint "FK_public.UserBankAccountTransactions_public.UserBankAccounts_P" for relation "UserBankAccountTransactions" already existsa
问题
有没有办法在 EF6 中将多个 References/ForeignKeys 添加到相同的 table?
Postgres 对标识符的最大长度有限制 - 63 bytes,因此你的两个外键最终都具有相同的名称 - FK_public.UserBankAccountTransactions_public.UserBankAccounts_P
.
所以你需要想办法指定FK名称。不确定它可以通过 attribute/fluent api 完成(至少我找不到它)但是作为解决方法你应该能够通过 [=15] 的 name
参数指定它=] 生成的迁移中的方法(这通常不是一件好事):
.ForeignKey("public.UserBankAccounts", t => t.PayeeBankAccountId, cascadeDelete: true, name: "FK_UBAT_UBA_PayeeBankAccountId" )
.ForeignKey("public.UserBankAccounts", t => t.PayerBankAccountId, cascadeDelete: true, name: "FK_UBAT_UBA_PayerBankAccountId")
我有同样的问题,但是 Sql server
我是这样解决的:
public class UserBankAccountTransaction
{
[ForeignKey(nameof(PayerBankAccount))]
public long PayerBankAccountId { get; set; }
public virtual UserBankAccount PayerBankAccount { get; set; }
[ForeignKey(nameof(PayeeBankAccount))]
public long PayeeBankAccountId { get; set; }
public virtual UserBankAccount PayeeBankAccount { get; set; }
[Required]
public int Amount { get; set; }
}
public class UserBankAccount
{
//other properties
[InverseProperty(nameof(UserBankAccountTransaction.PayerBankAccount))]
public UserBankAccountTransaction PayerUserBankAccountTransaction { get; set; }
//or public List<UserBankAccountTransaction> PayerUserBankAccountTransactions { get; set; }
[InverseProperty(nameof(UserBankAccountTransaction.PayeeBankAccount))]
public UserBankAccountTransaction PayeeUserBankAccountTransaction { get; set; } // or list ...
}
我正在使用 Entity Framework 6.4.x 与 Npgsql 和代码优先方法。
我创建了以下实体:
public class UserBankAccountTransaction
{
public long PayerBankAccountId { get; set; }
[ForeignKey(nameof(PayerBankAccountId))]
public virtual UserBankAccount PayerBankAccount { get; set; }
public long PayeeBankAccountId { get; set; }
[ForeignKey(nameof(PayeeBankAccountId))]
public virtual UserBankAccount PayeeBankAccount { get; set; }
[Required]
public int Amount { get; set; }
}
就是这样,现在当我执行 Add-Migration
时,它会创建以下迁移:
CreateTable(
"public.UserBankAccountTransactions",
c => new
{
Id = c.Long(nullable: false, identity: true),
PayerBankAccountId = c.Long(nullable: false),
PayeeBankAccountId = c.Long(nullable: false),
Amount = c.Int(nullable: false),
CreatedDate = c.DateTime(nullable: false),
ModifiedDate = c.DateTime(nullable: false),
})
.PrimaryKey(t => t.Id)
.ForeignKey("public.UserBankAccounts", t => t.PayeeBankAccountId, cascadeDelete: true)
.ForeignKey("public.UserBankAccounts", t => t.PayerBankAccountId, cascadeDelete: true)
.Index(t => t.PayerBankAccountId)
.Index(t => t.PayeeBankAccountId);
正如您在上面自动生成的迁移中看到的那样,"public.UserBankAccounts"
是生成两次同名的外键。
因此当我 Update-Migration
我得到这个错误:
constraint "FK_public.UserBankAccountTransactions_public.UserBankAccounts_P" for relation "UserBankAccountTransactions" already existsa
问题
有没有办法在 EF6 中将多个 References/ForeignKeys 添加到相同的 table?
Postgres 对标识符的最大长度有限制 - 63 bytes,因此你的两个外键最终都具有相同的名称 - FK_public.UserBankAccountTransactions_public.UserBankAccounts_P
.
所以你需要想办法指定FK名称。不确定它可以通过 attribute/fluent api 完成(至少我找不到它)但是作为解决方法你应该能够通过 [=15] 的 name
参数指定它=] 生成的迁移中的方法(这通常不是一件好事):
.ForeignKey("public.UserBankAccounts", t => t.PayeeBankAccountId, cascadeDelete: true, name: "FK_UBAT_UBA_PayeeBankAccountId" )
.ForeignKey("public.UserBankAccounts", t => t.PayerBankAccountId, cascadeDelete: true, name: "FK_UBAT_UBA_PayerBankAccountId")
我有同样的问题,但是 Sql server
我是这样解决的:
public class UserBankAccountTransaction
{
[ForeignKey(nameof(PayerBankAccount))]
public long PayerBankAccountId { get; set; }
public virtual UserBankAccount PayerBankAccount { get; set; }
[ForeignKey(nameof(PayeeBankAccount))]
public long PayeeBankAccountId { get; set; }
public virtual UserBankAccount PayeeBankAccount { get; set; }
[Required]
public int Amount { get; set; }
}
public class UserBankAccount
{
//other properties
[InverseProperty(nameof(UserBankAccountTransaction.PayerBankAccount))]
public UserBankAccountTransaction PayerUserBankAccountTransaction { get; set; }
//or public List<UserBankAccountTransaction> PayerUserBankAccountTransactions { get; set; }
[InverseProperty(nameof(UserBankAccountTransaction.PayeeBankAccount))]
public UserBankAccountTransaction PayeeUserBankAccountTransaction { get; set; } // or list ...
}