代码优先,多个外键

时间:2015-03-26 19:59:42

标签: c# sql-server entity-framework ef-code-first

首先让我为糟糕的头衔道歉,我不太清楚该怎么称呼这个话题。

不管怎么说..

我首先尝试使用代码创建BankAccount<-->Transactions关系。

以下是我的&#34;实体类&#34;

public class BankAccount : BaseEntity
{
    public string Name { get; set; }
    public double Balance { get; set; }

    public virtual long UserId { get; set; }
    public virtual User User { get; set; }

    public virtual ICollection<Transaction> FromTransactions { get; set; }

    public virtual ICollection<Transaction> ToTransactions { get; set; }
}

public class Transaction : BaseEntity
{
    public string Message { get; set; }
    public double Amount { get; set; }

    public virtual long ToId { get; set; }
    public virtual BankAccount To { get; set; }

    public virtual long FromId { get; set; }
    public virtual BankAccount From { get; set; }
}

正如您所看到的,我希望交易能够拥有一个&#34; From&#34; BankAccount和&#34; To&#34; BankAccount,可以轻松地从事务导航到归属的BankAccount。此外,BankAccount有两个交易集合,一个是&#34; From&#34;还有一个&#34; To&#34;,这也使得在对象之间导航变得容易。

问题是,只要我运行Update-Database,它就会失败:

  

角色的变化冲突&#39; BankAccount_ToTransactions_Source&#39;关系&#39; OpenFridge.Api.Data.BankAccount_ToTransactions&#39;已被发现

我还添加了以下两个EntityTypeConfigurations

public class BankAccountEntityTypeConfiguration : BaseEntityTypeConfiguration<BankAccount>
    {
        public BankAccountEntityTypeConfiguration()
        {
            ToTable("BankAccounts");

            HasRequired(e => e.User)
                .WithMany(e => e.BankAccounts);

            Property(e => e.Balance)
                .IsRequired();

            Property(e => e.Name)
                .IsRequired();

            HasMany(e => e.ToTransactions)
                .WithRequired(e => e.To).WillCascadeOnDelete(false);

            HasMany(e => e.FromTransactions)
                .WithRequired(e => e.From).WillCascadeOnDelete(false);
        }
    }

public class TransactionEntityTypeConfiguration : BaseEntityTypeConfiguration<Transaction>
    {
        public TransactionEntityTypeConfiguration()
        {
            ToTable("Transactions");

            Property(e => e.Amount)
                .IsRequired();

            HasRequired(e => e.From);

            HasRequired(e => e.To);
        }
    }

如何以正确的方式创建这种关系?我可能只是在我的数据库设计中遗漏了一些东西..

BR, INX

2 个答案:

答案 0 :(得分:0)

对于它的价值,快速修复更新数据库失败(如果您仍处于设计阶段)是删除数据库并再次运行update-database以从头开始构建。有时,在更改模型时,错误与事件序列有关。 您可以进行的另一项检查是运行update-database -script并手动在数据库中运行生成的SQL。 我可以提供的最后一个快速修复是删除数据库中的违规关系。

为了帮助您将来使用模型[Required] [Key] [ForeignKey("ForeignKeyId")]中的数据注释可能有助于指定所有内容的连接方式,并将配置中的代码简化为关系。

答案 1 :(得分:0)

您可能需要在Transaction实体中指定外键的名称,如下所示:

public class Transaction : BaseEntity
{
    public string Message { get; set; }
    public double Amount { get; set; }

    public virtual long ToId { get; set; }
    [ForeignKey("ToId")]
    public virtual BankAccount To { get; set; }

    public virtual long FromId { get; set; }
    [ForeignKey("FromId")]
    public virtual BankAccount From { get; set; }
}