3

サーバーとクライアントの間で保持したいマップされていない列を持つ Entity Framework Code First モデルがあります。モデルは、さらに多くのプロパティを持つ次のようになります。

public class OwnerInformation
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Required]
    [MaxLength(16)]
    public byte[] SSNEncrypted { get; set; }

    [NotMapped]
    [MaxLength(9)]
    [MinLength(9)]
    public string SSN { get; set; }
}

メタデータが Breeze によって取得されるとき、SSN はメタデータの一部ではありませんが、データがネットワーク経由で送信されるとき、SSN は存在します。メタデータを介してそよ風にマッピングを処理させたいのですが、DB に保存する前に暗号化する必要があるため、クライアントとサーバーの間で SSN を渡し、その状態を追跡できるようにしたいと考えています。

メタデータが次のようにフェッチされた後に追加してみました:

var ownerType = manager.metadataStore.getEntityType('OwnerInformation');
var sSN = new breeze.DataProperty({
  name: 'sSN',
  dataType: breeze.DataType.String,
  isNullable: false,
  maxLength: 9
});
ownerType.addProperty(sSN);

しかし、私はエラーが発生します:The 'OwnerInformation:#Models' EntityType has already been added to a MetadataStore and therefore no additional properties may be added to it.

たぶん私はこれを考えすぎており、もっと簡単な方法があります。私はどんな提案にも心を開いています。

4

2 に答える 2

5

私は別のアプローチを取り、実行時にサーバーでメタデータを変更することにしました。これが私がやった方法です。

public class MyContextProvider : EFContextProvider<MyContext>
{
  protected override string BuildJsonMetadata()
  {
    string metadata = base.BuildJsonMetadata();
    JObject json = JObject.Parse(metadata);
    var entityOwnerInfo = json["schema"]["entityType"].Children().Where(j => (string)j["name"] == "OwnerInformation").SingleOrDefault();
    var propertyArray = entityOwnerInfo["property"] as Newtonsoft.Json.Linq.JArray;

    JToken ssnPropertyType = JToken.Parse(@"{
      ""name"": ""SSN"",
      ""type"": ""Edm.String"",
      ""fixedLength"": ""true"",
      ""maxLength"": ""9"",
      ""minLength"": ""9"",
      ""nullable"": ""false""}");
    propertyArray.Add(ssnPropertyType);

    return json.ToString();
  }
}
于 2013-08-09T14:44:10.020 に答える