我想使用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行?
非常感谢!
答案 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。
您至少必须创建三个具有相同属性的单独类,Address
,Nickname
和Name
这是不可能的。 EF不能在同一上下文中两次映射相同的类。您的单个User类只能以单个上下文类型映射到Users表或TempUsers表。您需要两个用户类或两个不同的上下文类型(具有不同的映射配置) - 一个提供对Users表的访问,另一个提供对TempUsers表的访问。