【问题标题】:EF 4.1 Code First doesn't create column for List<string>EF 4.1 Code First 不会为 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。

【问题讨论】:

    标签: entity-framework-4.1 code-first


    【解决方案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 无法将字符串列表“映射”到您的父类。由于它的内置配置或您的注释,它可以映射另一个实体的列表.... :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多