【问题标题】:Code-first changing the name of bridge entity table代码优先更改桥实体表的名称
【发布时间】:2012-01-24 23:31:23
【问题描述】:

有没有办法控制桥实体创建的表的名称?现在如果我运行这个:

public class Foo
{
    public Int32 FooId { get; set; }
    public virtual ICollection<Bar> Bars { get; set; }
}

public class Bar
{
    public Int32 BarId { get; set; }
    public virtual ICollection<Foo> Foos { get; set; }
}

生成的桥接表名为 BarFoo,有什么方法可以改为 FooBar?

【问题讨论】:

    标签: c# asp.net-mvc entity-framework ef-code-first


    【解决方案1】:

    您可以通过如下映射自定义表名。

    public class MyContext : DbContext
    {    
         protected override void OnModelCreating(DbModelBuilder modelBuilder)
         {
             modelBuilder.Entity<Foo>()
               .HasMany(e => e.Bars)
               .WithMany(s => s.Foos)
               .Map(l =>
                 {
                    l.ToTable("FooBar");
                    l.MapLeftKey("FooId");
                    l.MapRightKey("BarId");
                 }
               );
        }
    }
    

    【讨论】:

    • 这不像我希望的那样工作,至少在 EF 6 中它没有。我的向上迁移按预期将其称为 FooBar,我的向下迁移按预期将其称为 FooBar。出于所有密集目的,您会认为该表实际上称为 FooBar,因为我可以在代码中这样引用它。但是,查看 SQL Management Studio,我可以看到物理表“仍然”命名为 BooFar。 Entity 只是在代码中为我做一些映射,而不是实际命名实际的表本身。
    【解决方案2】:

    看看EntityTypeConfiguration 和fluent config api。里面有一个 HasMany() 方法,可以做你想做的事。

    【讨论】:

    • 哦,我真的想避免流利的 api... 希望有一些方法来装饰一些东西......
    • 好的。我是相反的,我讨厌用大量的属性来装饰我的代码,它看起来很乱 IMO。每个人都有自己的;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    • 2012-03-22
    • 2016-11-12
    相关资源
    最近更新 更多