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 ...

}