gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:44:15 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com