C# 代码优先,多个外键
首先,让我为这个糟糕的标题道歉,我不太清楚该怎么称呼这个话题 无论如何 我正在尝试先使用代码创建一个C# 代码优先,多个外键,c#,sql-server,entity-framework,ef-code-first,C#,Sql Server,Entity Framework,Ef Code First,首先,让我为这个糟糕的标题道歉,我不太清楚该怎么称呼这个话题 无论如何 我正在尝试先使用代码创建一个BankAccountTransactions关系 以下是我的“实体类” 如您所见,我希望交易能够有一个“From”BankAccount和一个“to”BankAccount,以便于从交易导航到所属银行账户。另外,BankAccount有两个事务集合,一个是“From”,另一个是“To”,这也使得在对象之间导航变得容易 问题是,只要我运行更新数据库,它就会出现以下故障: 已检测到对关系“OpenF
BankAccountTransactions
关系
以下是我的“实体类”
如您所见,我希望交易能够有一个“From”BankAccount
和一个“to”BankAccount
,以便于从交易导航到所属银行账户。另外,BankAccount
有两个事务集合,一个是“From”,另一个是“To”,这也使得在对象之间导航变得容易
问题是,只要我运行更新数据库
,它就会出现以下故障:
已检测到对关系“OpenFridge.Api.Data.BankAccount\u ToTransactions\u Source”的角色“BankAccount\u ToTransactions\u Source”的冲突更改
我还添加了以下两个EntityTypeConfiguration
:
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);
}
}
公共类BankAccountEntityTypeConfiguration:BaseEntityTypeConfiguration
{
public BankAccountEntityTypeConfiguration()
{
可转帐(“银行账户”);
HasRequired(e=>e.User)
.有许多(e=>e.银行账户);
属性(e=>e.Balance)
.IsRequired();
属性(e=>e.Name)
.IsRequired();
有许多(e=>e.ToTransactions)
.WithRequired(e=>e.To).WillCascadeOnDelete(false);
有许多(e=>e.FromTransactions)
.WithRequired(e=>e.From).WillCascadeOnDelete(false);
}
}
公共类TransactionEntityTypeConfiguration:BaseEntityTypeConfiguration
{
公共事务实体类型配置()
{
可转帐(“交易”);
属性(e=>e.Amount)
.IsRequired();
HasRequired(e=>e.From);
HasRequired(e=>e.To);
}
}
你知道如何以恰当的方式建立这种关系吗?我可能只是在数据库设计中遗漏了一些东西
比尔,
Inx值得一提的是,对于失败的更新数据库(如果您仍处于设计阶段)的快速修复方法是删除数据库并再次运行更新数据库以从头开始构建。有时,错误与更改模型时的事件顺序有关。 您可以进行的另一项检查是运行
updatedatabase-script
,并在数据库中手动运行生成的SQL。
我能提供的最后一个快速修复方法是删除数据库中有问题的关系
为了在将来帮助您,在您的模型中使用数据注释可能会有所帮助
[必需][Key][ForeignKey(“ForeignKeyId”)]
有助于指定所有内容的连接方式,并将配置中的代码简化为关系。您可能需要在事务
实体中指定外键的名称,如下所示:
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; }
}
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);
}
}
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; }
}