当创建包含基本类型集合并且由EF Code First持久化的POCO类时,我到目前为止找到的最好建议是创建一个具有ID加上基本类型的新类:
Entity Framework and Models with Simple Arrays
如果我现在有几个类需要ObservableCollection<string>
类型的属性并将其替换为ObservableCollection<EntityString>
(其中EntityString
是一个带有Id和字符串属性的自定义类型),我结束了使用具有多个外键列的表EntityString
,对于具有此类属性的所有具体类型,每个属性类型ObservableCollection<EntityString>
一个。
这会导致EntityString
表中大多数为空的外键列膨胀。
一种方法是创建EntityString
的子类,并为这些子类使用Table per Type模型。但是,这需要对对象模型进行笨拙的更改,以适应实体框架。
问题:
Collection<PrimitiveType>
的最佳方式吗?答案 0 :(得分:5)
将简单类型提升为实体是一种选择。如果要在更多关系中使用新的基本类型实体,最好从该实体中完全删除导航属性并使用独立关联(无FK属性)。
public class StringEntity
{
public int Id { get; set; }
public string Text { get; set; }
}
和映射:
modelBuilder.Entity<Foo1>().HasMany(f => f.Strings).WithOptional();
modelBuilder.Entity<Foo2>().HasMany(f => f.Strings).WithOptional();
在数据库中,你将获得每个相关主体的新的可空FK - 除了为每个主体创建特殊的StringEntity
类之外没有办法避免它(不要使用继承,因为它会影响性能)。
还有另一种选择:
public class StringEntity
{
public int Id { get; set; }
public List<string> Strings { get; private set; }
public string Text
{
get
{
return String.Join(";", Strings);
}
set
{
Strings = value.Split(";").ToList();
}
}
}
在这种情况下,您不需要相关的实体类型(和附加表),但您的实体受到其他属性Text
的污染,这仅用于持久性。