c# - 使用 Entity Framework 4 对字段进行自定义序列化/反序列化

标签 c# .net-4.0 entity-framework-4 poco

我负责将我们自己的 DAL 迁移到基于 Entity Framework 4 的解决方案,但在此之前,我需要确保可以将我们所有的“构造”转换为这项新技术。

我遇到的最大问题之一是读取字段并构建自定义类型的可能性。有效示例可以是保存在 BIGINT 字段中的位掩码、保存为 NVARCHAR 字段中的 CSV 列表的邮件地址列表或包含不值得拥有自己的表/实体的聚合数据的 XML 字段。基本上序列化机制是不固定的。

让我们以经典的“地址”为例。

public class Address
{
    public string Street {get; set;}
    public string City {get; set;}
    public string Zip {get; set;}
    public string Country {get; set;}
}

假设我们要使用此模板将其保存在 XML 字段中:

<address>
  <street>Abrahamsbergsvägen, 73</street>
  <city>Stockholm</city>
  <zip>16830</zip>
  <country>Sweden</country>
</address>

问题基本上是:是否存在一种方法来覆盖 EF4 如何序列化和反序列化映射到实体属性的字段的内容?

最佳答案

我找到了这个解决方案。它不像我希望的那样干净,但似乎不可能得到更好的东西。

给定这个基础实体,

public class Institute
{
    public int InstituteID { get; set; }
    public string Name { get; set; }
    // other properties omitted
}

我使用这个简单的模板在数据库中添加了一个名为 Data 的 XML 字段,其中包含一些字符串

<values>
  <value>Value 1</value>
  <value>Value 2</value>
  <value>Value 3</value>
</values>

在实体中我添加了这些属性并将数据库字段“Data”映射到属性“DataRaw”。

protected string DataRaw
{
    get
    {
        if (_Data == null)
            return _DataRaw;
        else
            return new XElement("values", from s in Data select new XElement("value", s)).ToString();
    }
    set
    {
        _DataRaw = value;
    }
}

private string _DataRaw;
private string[] _Data;

public string[] Data
{
    get
    {
        if (_Data == null)
        {
            _Data = (from elem in XDocument.Parse(_DataRaw).Root.Elements("value")
                     select elem.Value).ToArray();
        }
        return _Data;
    }

    set
    {
        _Data = value;
    }
}

这个解决方案有效。这是示例代码:

class Program
{
    static void Main(string[] args)
    {
        var ctx = new ObjectContext("name=TestEntities");

        var institute = ctx.CreateObjectSet<Institute>().First();

        System.Console.WriteLine("{0}, {1}", institute.InstituteID, institute.Name);
        foreach (string data in institute.Data)
            System.Console.WriteLine("\t{0}", data);

        institute.Data = new string[] { 
            "New value 1",
            "New value 2",
            "New value 3"
        };

        ctx.SaveChanges();
    }
}

有没有人有更好的解决方案?

关于c# - 使用 Entity Framework 4 对字段进行自定义序列化/反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3829265/

相关文章:

c# - VSTO(Outlook 加载项)设置部署 (C#)

vb.net - Timer_tick 无法停止的问题

c# - 有没有办法告诉 Visual Studio 在 Debug模式下默认显示某些成员值?

entity-framework - EF 中 ConcurrencyCheck 属性方法的问题

entity-framework - EF4 - 强制执行顺序

c# - LINQ 查询根据匹配的另一个表从一个表返回

c# - 创建由多个属性值组成的序列

c# - App.Config 错误 "Configuration system failed to initialize"

.net - Entity Framework 4.3 与 5.0 更新差异

c# - System.Int32 比使用 int 慢吗?