我负责将我们自己的 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/