【问题标题】:Custom serialization/deserialization over a field with Entity Framework 4使用 Entity Framework 4 对字段进行自定义序列化/反序列化
【发布时间】:2010-09-30 09:15:38
【问题描述】:

我负责将我们自己的 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 如何序列化和反序列化映射到实体属性的字段内容?

【问题讨论】:

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


    【解决方案1】:

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

    鉴于此基础实体,

    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();
        }
    }
    

    谁有更好的解决方案?

    【讨论】:

      【解决方案2】:

      实体框架不会序列化或反序列化实体,也不会控制序列化应如何在应用程序的其他层或模块中进行。
      您需要做的是简单地打开您的 POCO 并使用适当的属性注释它们的属性,当您希望将它们发送到其他应用程序层时,这些属性将在序列化时考虑在内。

      【讨论】:

      • 我的意思不是将一个实体序列化到其他应用层,而是一个特定字段的值
      猜你喜欢
      • 1970-01-01
      • 2015-01-27
      • 1970-01-01
      • 2023-03-03
      • 2016-03-14
      • 2021-02-03
      • 1970-01-01
      • 2013-07-17
      • 1970-01-01
      相关资源
      最近更新 更多