2016-12-10 7 views
0

У меня естьОдин к одному ФВ, где один из объектов имеют составной ключ

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 работает вокруг этого) отношения между Expense и Category. Я хочу, чтобы ExpenseCategory являлась моим сопоставлением между Expense и Category. Должна быть только одна ExpenseCategory per Expense, и я хочу, чтобы ключ этого сопоставления был идентификатором Expense.

У меня возникли проблемы, с чем-либо я стараюсь. С текущей настройкой я получаю:

Количество свойств в зависимых и главных ролях в отношении отношений должно быть идентичным.

Я думаю, что проблема может исходить из составного ключа на Расходе.

Любая помощь?

ответ

0

Понял. Добавлены следующие на моем 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);