首先让我为糟糕的头衔道歉,我不太清楚该怎么称呼这个话题。
不管怎么说..
我首先尝试使用代码创建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
答案 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; }
}