EF 4.1 Code First 不会为 List<string> 创建列

Posted

技术标签:

【中文标题】EF 4.1 Code First 不会为 List<string> 创建列【英文标题】:EF 4.1 Code First doesn't create column for List<string> 【发布时间】:2011-05-14 17:42:33 【问题描述】:

我一直在玩 EF4 Code First,我非常喜欢它。但是,我似乎无法解决这个简单的问题。

当试图创建这样的东西时,我的数据库中没有创建任何列:

    public IList<String> Recievers  get; set; 
    public List<String> RecieversTest  get; set; 

    public virtual List<String> RecieversAnotherTest  get; set; 
    public virtual ICollection<Int32> RecieversAnotherTest  get; set; 

我尝试过 Annotations 将其映射到不同的列名,我尝试过 IEnumerable 和各种其他集合,但它拒绝为其创建列。

在谷歌上一个小时后,我发现一个声称她已经做到了,但我开始怀疑这一点。有可能吗?

我真的不明白为什么它只是不创建列并使用 JSON 或 CSV。 不可能那么稀有吧?就我而言,我只想存储一个电子邮件列表。

我错过了什么?该项目可以毫无问题地创建所有其他类型,并且我检查了数据库以查看我添加以测试的其他属性是如何创建的,而这些被忽略了。

所以问题一定在于我缺少某些设置或某些配置.... SQL Server 2008 数据库上的 EF 4.1 RTW。

【问题讨论】:

【参考方案1】:

我有个坏消息要告诉你。 EF 不会做这样的事情。如果你想要任何序列化和反序列化,你必须自己做=你必须公开和映射具有序列化值的属性:

private IList<String> _receivers;
// This will be skipped
public IList<String> Receivers 
 
    get
    
        return _receivers;
    
    set
    
        _receivers = value;
     


// This will be mapped
public string ReceiversSer

    get
    
        return String.Join(";", _receivers);
    
    set
    
        _receivers = value.Split(';').ToList();
    

现在ReceiversSer 将映射到数据库中的列。

【讨论】:

非常聪明的解决方案...我喜欢你如何做到这一点 @Ladislav-mrnka 很好的解决方案。唯一的问题是它不处理空引用。将_receivers = value.Split(';').ToList(); 替换为_receivers = value != null ? value.Split(';').ToList() : null;【参考方案2】:

您不能有基于某物的集合/列表的列。列是单个项目,例如 public string Receiver

如果您希望 EF CF 获取您的 IList 或 List 并从中创建几个列,那么您是正确的,因为它不会。

在 EF CF 中,您可以在 Entity 中创建列表来表示与另一个表的关系。一个订单可能有很多项目。在这种情况下,您将拥有一个 Order 类,其中包含一个 OrderItem 对象的列表。

然后您将有一个 OrderItem 类来描述 OrderItem 表。这将基本上代表 Order 和 OrderItems 的一对多关系。

【讨论】:

你可能是对的,但我并不真正相信你的论点。像订单和字符串这样的自定义类之间有很大的区别。我不希望 EF 为我创建几个列,但我有点希望它将我的列表序列化为适当的格式,然后在获取时对其进行反序列化。我想我已经有点被宠坏了。我可以看到潜在的问题,但考虑到 EF 在其他情况下的作用,我真的看不出有什么不支持的重要原因。 EF 无法将字符串列表“映射”到您的父类。由于它的内置配置或您的注释,它可以映射另一个实体的列表.... :-)

以上是关于EF 4.1 Code First 不会为 List<string> 创建列的主要内容,如果未能解决你的问题,请参考以下文章

EF 4.1 Code First - 我应该使用啥模式?

EF 4.1 Code First - 在 Firebird 数据库中存储图像

EF 4.1 中使用 Code First 的 ComplexType 集合属性

在使用 EF 4.1 Code-First 的 Include 和/或 Select 方法时订购导航属性?

EF 4.1 Code-First 项目上的 MvcMiniProfiler 不分析 SQL

EF 4.1:使用 Fluent 映射从 Code First 中查找关键属性类型