2015-11-12 2 views
0

Я имею следующую конфигурацию лица:EF Fluent API создает повторяющиеся таблицы

public class OfficesContext : DbContext 
{ 
    public DbSet<Office> Offices { get; set; } 
    public DbSet<Expense> Expenses { get; set; } 
    public DbSet<ExpenseLog> ExpenseLogs { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Office>() 
      .Property(o => o.OfficeId) 
      .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 
     modelBuilder.Entity<Expense>() 
         .Property(o => o.ExpenseId) 
         .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 
     modelBuilder.Entity<Office>() 
      .HasMany(o => o.Expenses) 
      .WithMany() 
      .Map(mc => 
      { 
       mc.ToTable("ExpenseLogs"); 
       mc.MapLeftKey("ExpenseId"); 
       mc.MapRightKey("OfficeId"); 
      }); 
    } 
} 

public class Office 
{ 
    public Office() 
    { 
     ExpenseLogs = new HashSet<ExpenseLog>(); 
     Expenses = new HashSet<Expense>(); 
    } 

    public int OfficeId { get; set; } 

    public string Name { get; set; } 

    public ICollection<ExpenseLog> ExpenseLogs { get; private set; } 

    public ICollection<Expense> Expenses { get; private set; } 
} 

public class Expense 
{ 
    public Expense() 
    { 
     ExpenseLogs = new HashSet<ExpenseLog>(); 
     Offices = new HashSet<Office>(); 
    } 

    public int ExpenseId { get; set; } 

    public string Name { get; set; } 

    public ICollection<ExpenseLog> ExpenseLogs { get; private set; } 

    public ICollection<Office> Offices { get; private set; } 
} 

public class ExpenseLog 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int ExpenseLogId { get; set; } 

    public int OfficeId { get; set; } 

    public Office Office { get; set; } 

    public int ExpenseId { get; set; } 

    public Expense Expense { get; set; } 

    public DateTime InputDate { get; set; } 

    public decimal Amoun { get; set; } 

    public string Description { get; set; } 

} 

Но он создает две таблицы для РАСХОДЫ бревен ExpenseLogs и ExpenseLogs1. ExpenseLogs имеет только внешние ключи ExpenseId и OfficeId. ExpenseLogs1 имеет те же поля, что и в классе ExpenseLog. Я также пытался использовать следующие сопоставления, но это не помогло:

modelBuilder.Entity<ExpenseLog>().HasRequired(e => e.Office); 
modelBuilder.Entity<ExpenseLog>().HasRequired(e => e.Expense); 

ответ

0

У вас есть некоторые избыточные конфигурации Попробуйте эти изменения:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Office>() 
     .Property(o => o.OfficeId) 
     .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 
    modelBuilder.Entity<Expense>() 
        .Property(o => o.ExpenseId) 
        .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 

// ** this is redundant - ef will figure it from the bridge class ** 
// modelBuilder.Entity<Office>() 
//  .HasMany(o => o.Expenses) 
//  .WithMany() 
//  .Map(mc => 
//  { 
//   mc.ToTable("ExpenseLogs"); 
//   mc.MapLeftKey("ExpenseId"); 
//   mc.MapRightKey("OfficeId"); 
//  }); 
} 

public class Office 
{ 
    public Office() 
    { 
     ExpenseLogs = new HashSet<ExpenseLog>(); 
     Expenses = new HashSet<Expense>(); 
    } 

    public int OfficeId { get; set; } 

    public string Name { get; set; } 

    public ICollection<ExpenseLog> ExpenseLogs { get; private set; } 

    // access offices thru ExpenseLogs 
    // public ICollection<Expense> Expenses { get; private set; } 
} 

public class Expense 
{ 
    public Expense() 
    { 
     ExpenseLogs = new HashSet<ExpenseLog>(); 
     Offices = new HashSet<Office>(); 
    } 

    public int ExpenseId { get; set; } 

    public string Name { get; set; } 

    public ICollection<ExpenseLog> ExpenseLogs { get; private set; } 

    // access offices thru ExpenseLogs 
    // public ICollection<Office> Offices { get; private set; } 
} 

См Create code first, many to many, with additional fields in association table

+0

Это удалит дублируя таблицу, но это не будет отношение «многие ко многим», поскольку расходы должны быть удалены из офиса и офисов, должны быть удалены из «Расходы». – Mardok

+0

Прочтите ссылку внизу. Он содержит один из лучших ответов, которые вы когда-либо увидите на SO. Если вам нужны свойства в вашей таблице соединений, это единственный метод, доступный в настоящее время через EF6. Не уверен в EF7. –

+0

Итак, это говорит «это невозможно». Пожалуйста, уточните, что вы ответите, и я пометю его как принятый. – Mardok

Смежные вопросы