微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

EF6

如何解决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 中将多个引用/外键添加到同一个表中吗?

解决方法

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 举报,一经查实,本站将立刻删除。