0

EF Code Firstに、この例のスカラープロパティを格納する方法を指定する方法があるかどうか疑問に思いました。

私はこのPOCOオブジェクトを持っています:

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

マップまたはその他のメカニズムでprotobuffを使用して、Urlをbyte []として格納するようにEFに指示する方法はありますか?

4

2 に答える 2

0

クラスbyte[]に直接2番目のプロパティを作成しない限り、できません。MyObject新しいプロパティをマップし、古いプロパティを無視するよりも。このマッピングを取得したら、変換ロジックをクラスに直接含めるか(Urlsプロパティのgetterおよびsetterに)、またはデータアクセスインフラストラクチャのスコープで変換を行うSaveChangesためにoverrideedおよびhandlerを使用するかどうかはあなた次第です。ObjectContext.ObjectMaterialized

これを選択した場合、URLでクエリを実行することはできません。EFで表示される唯一のプロパティは、新しいバイト配列です。

于 2012-12-12T12:40:20.657 に答える
0

いいえ、アイテムのコレクションをbyte []として保存するようにEFに直接指示することはできないと思いますが、少し回避策を使用できます。

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 に答える