2010-09-30 62 views
2

我负责将我们自己的DAL迁移到基于Entity Framework 4的解决方案,但是在我能做到之前,我需要确保可以将所有我们对这项新技术的“建构”。使用实体框架对字段进行自定义序列化/反序列化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如何序列化和反序列化的内容字段映射到实体的属性?

回答

2

我找到了这个解决方案。它没有我想要的那么干净,但似乎不可能得到更好的东西。

给出此基础实体,

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

我在数据库中添加叫做数据使用这个简单的模板

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

在实体包含一些串我添加这些属性和我映射的XML字段数据库字段“数据”到属性“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(); 
    } 
} 

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

0

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

+0

我并不是要将一个实体序列化到其他应用程序层,而是指定一个特定字段的值 – Kralizek 2010-10-05 09:00:03

相关问题