EF Code First指定如何存储标量属性

时间:2012-12-12 10:09:23

标签: ef-code-first entity-framework-5

我想知道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 []?

2 个答案:

答案 0 :(得分:0)

否,除非您直接在byte[]课程中创建第二个MyObject属性。比您将映射新属性并忽略旧属性。如果您有这个映射,如果您将转换逻辑直接包含在类中(对于Urls属性的getter和setter),或者如果您使用覆盖SaveChangesObjectContext.ObjectMaterialized的处理程序来执行此操作,则由您决定。数据访问基础架构范围的转换。

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

答案 1 :(得分:0)

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

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

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