我想知道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 []?
答案 0 :(得分:0)
否,除非您直接在byte[]
课程中创建第二个MyObject
属性。比您将映射新属性并忽略旧属性。如果您有这个映射,如果您将转换逻辑直接包含在类中(对于Urls属性的getter和setter),或者如果您使用覆盖SaveChanges
和ObjectContext.ObjectMaterialized
的处理程序来执行此操作,则由您决定。数据访问基础架构范围的转换。
如果您选择,您将无法通过Urls进行查询。 EF的唯一可见属性是新的字节数组。
答案 1 :(得分: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
。