0

我想知道 EF Code First 中是否有一种方法可以指定如何存储此示例的标量属性:

我有这个 POCO 对象:

public class MyObject
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public ICollection<Url> Urls { get; set; }
}

有没有办法告诉 EF 使用带有地图或任何其他机制的 protobuff 将 Urls 存储为 byte[] ?

4

2 回答 2

0

byte[]不,除非您直接在您的MyObject班级中创建第二个属性。然后您将映射一个新属性并忽略旧属性。一旦你有了这个映射,你是否将转换逻辑直接包含到类中(到 Urls 属性的 getter 和 setter),或者如果你使用覆盖SaveChanges和处理程序ObjectContext.ObjectMaterialized来在数据访问基础结构范围内进行转换,这取决于你。

如果您选择,您将无法通过 Urls 进行查询。EF 唯一可见的属性是新的字节数组。

于 2012-12-12T12:40:20.657 回答
0

不,我认为不可能直接指示 EF 将项目集合存储为 byte[],但您可以使用一些解决方法。

NotMapped向属性添加 属性Urls- 它从 EF 模型中排除属性,然后添加另一个属性SerializedUrls,该属性将包含序列化为 byte[] 的集合,并将其保存到 DB。最后通过 getter/setter同步Urls和属性。SerializedUrls

private byte[] _serializedUrls;
private ICollection<Url> _urls;

public byte[] SerializedUrls { 
  get { return _serializedUrls; }
  set {
    _urls = this.Deserialize(value);
    _serializedUrls = value;
  }
}

[NotMapped]
public ICollection<Url> Urls {
  get { return _urls; }
  set { 
    _urls = value;
    _serializedUrls = this.Serialize(value);        
  }
}

private byte[] Serialize(ICollection<Url> collection) {
  //call protobuf to serialize data
}

private ICollection<Url> Deserialize(byte[] data) {
  //call protobuf to deserialize data
}

public void UpdateSerializedValue() {
  serializedUrls = this.Serialize(_urls);
}

注意:由于集合的二进制表示在您添加/删除/更改集合中的项目时会发生变化,因此请确保在集合SerializedUrls内容发生更改时进行更新。

于 2012-12-12T12:52:49.170 回答