Один к одному EF, где один из объектов имеет составной ключ
Я имею
public class Expense
{
public int Id { get; private set; }
[ForeignKey("AccountId")]
public virtual Account Account { get; private set; }
[Required]
public int AccountId { get; private set; }
public virtual ExpenseCategory ExpenseCategory { get; private set; }
public Expense(... params ...)
{
this.ExpenseCategory = new ExpenseCategory();
}
protected Expense()
{
}
}
public class Account
{
[Key]
public int Id { get; private set; }
public virtual List<Expense> Expenses { get; private set; }
...
}
public class ExpenseCategory
{
[ForeignKey("CategoryId")]
public virtual BaseCategory Category { get; private set; }
public Guid? CategoryId { get; private set; }
public virtual Expense Expense { get; private set; }
[Key, ForeignKey("Expense")]
public int ExpenseId { get; private set; }
// EF is a 'friend' assembly, don't worry about the internal
internal ExpenseCategory()
{
}
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
// This deletes the Expense entity when it is removed from the Account
modelBuilder.Entity<Expense>()
.HasKey(t => new { t.Id, t.AccountId })
.Property(t => t.Id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
// PROBLEM STARTS HERE MAYBE
modelBuilder.Entity<ExpenseCategory>()
.HasKey(e => e.ExpenseId);
modelBuilder.Entity<Expense>()
.HasRequired(s => s.ExpenseCategory)
.WithRequiredPrincipal(tc => tc.Expense);
}
Мое отношение между расходами и аккаунтом в порядке - оно работает именно так, как мне нужно. Сейчас я пытаюсь ввести соотношение 1:1 (я знаю, что MSSQL не поддерживает его изначально, но EF работает вокруг этого) отношения между расходом и категорией. Я хочу, чтобы ExpenseCategory была моим отображением между расходами и категориями. Должна быть только одна ExpenseCategory для каждого Расхода, и я хочу, чтобы Ключ этого сопоставления был идентификатором Расхода.
У меня проблемы со всем, что я пытаюсь. С текущей настройкой я получаю:
количество свойств в зависимой и главной ролях в ограничении отношений должно быть одинаковым.
Я думаю, что проблема может быть из-за составного ключа на Расходе.
Любая помощь?
1 ответ
Догадаться. Добавлено следующее на моем ExpenseCategory
public int AccountId { get; private set; }
И следующий свободный API:
modelBuilder.Entity<ExpenseCategory>()
.HasKey(e => new { e.ExpenseId, e.AccountId });
modelBuilder.Entity<Expense>()
.HasRequired(s => s.ExpenseCategory)
.WithRequiredPrincipal(tc => tc.Expense)
.WillCascadeOnDelete(true);