【问题标题】:EF Fluent API creates duplicate tablesEF Fluent API 创建重复表
【发布时间】:2015-11-12 09:18:07
【问题描述】:

我有下一个实体配置:

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);

【问题讨论】:

    标签: c# .net entity-framework ef-code-first ef-fluent-api


    【解决方案1】:

    您有一些冗余配置尝试这些更改:

    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

    【讨论】:

    • 这将删除重复的表,但它不会是多对多的关系,因为应该从 Office 中删除费用,并且应该从费用中删除办公室。
    • 阅读底部的链接。它包含您将在 SO 上看到的最佳答案之一。如果您想要连接表中的属性,这是目前通过 EF6 可用的唯一技术。不确定 EF7。
    • 所以它说“不可能”。请更新您的答案,我会将其标记为已接受。
    猜你喜欢
    • 1970-01-01
    • 2015-03-19
    • 1970-01-01
    • 2014-09-05
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 2011-10-06
    • 2016-05-24
    相关资源
    最近更新 更多