Один к одному 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);
Другие вопросы по тегам