如何解决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
问题
解决方法
Postgres 对标识符的最大长度有限制 - 63 bytes,因此您的两个外键最终都具有相同的名称 - FK_public.UserBankAccountTransactions_public.UserBankAccounts_P
。
所以你需要找到一种方法来指定 FK 名称。不确定它是否可以通过属性/流畅的 api 完成(至少我找不到它)但作为解决方法,您应该能够通过生成的 TableBuilder<TColumns>.ForeignKey
方法的 name
参数指定它迁移(这通常不是一件好事):
.ForeignKey("public.UserBankAccounts",t => t.PayeeBankAccountId,cascadeDelete: true,name: "FK_UBAT_UBA_PayeeBankAccountId" )
.ForeignKey("public.UserBankAccounts",t => t.PayerBankAccountId,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 ...
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。