实体框架为我使用变量的每个地方创建一个新列

时间:2016-10-26 07:29:42

标签: c# mysql database entity-framework ef-migrations

我想使用Entity Framework 6.1来存储具有此布局的类中的对象:

Class Foo {
   int ID { get; set; }
   List<Bar> Names { get; set; };
   List<Bar> Addresses { get; set; };
   List<Bar> Nickname { get; set; };
}

Class Bar {
   int ID { get; set; }
   string Language  { get; set; }
  string value  { get; set; }
}

Entity Framework将Bar类转换为我的数据库中dbo.Bar表中的这些列:

ID |语言| Bar_FooId1 | Bar_FooId2 | Bar_FooId3

我明白为什么会这样做。它都需要一个将Bar中的值映射到我的Foo表的外键,以及一种显示它映射到Foo中的值的方法。

这看起来不错,但是列和单元格的数量会迅速爆炸,因为我将在数据库中的很多对象中使用Bar。

是否可以改为做其他事情?例如。有一个第三个表,通过某个标识符将Bar中的行链接到特定属性?或者也许从Foo表中引用相关的Bar行?

非常感谢!

1 个答案:

答案 0 :(得分:1)

您是否尝试过指定映射?

protected override void OnModelCreating(
    DbModelBuilder modelBuilder)
{
    if (modelBuilder == null)
        throw new ArgumentNullException(nameof(modelBuilder));
    base.OnModelCreating(modelBuilder);

    modelBuilder.Entity<Foo>().HasMany<Bar>(_ => _.Names).WithRequired().Map(_ => _.ToTable("Names"));
    modelBuilder.Entity<Foo>().HasMany<Bar>(_ => _.Addresses).WithRequired().Map(_ => _.ToTable("Addresses"));
    modelBuilder.Entity<Foo>().HasMany<Bar>(_ => _.Nickname).WithRequired(_ => _.Foo).Map(_ => _.ToTable("NickNames"));
}

不正确,以上操作无效!

我尝试了上面的映射,它们实际上不会起作用,看here。 您至少必须创建三个具有相同属性的单独类,AddressNicknameName

这是不可能的。 EF不能在同一上下文中两次映射相同的类。您的单个User类只能以单个上下文类型映射到Users表或TempUsers表。您需要两个用户类或两个不同的上下文类型(具有不同的映射配置) - 一个提供对Users表的访问,另一个提供对TempUsers表的访问。