3

我有一个实体框架代码优先模型,其中包含一个未映射的列,我仍然希望在服务器和客户端之间保留该列。该模型看起来与此类似,但具有更多属性:

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 就在那里。我想让微风通过元数据处理映射,但我希望仍然能够在客户端和服务器之间传递 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 回答
1

其实这是一个非常好的问题。Breeze 目前不支持在将 EntityType 添加到 MetadataStore 后对其进行修改。但是在你的场景中,我看到了用例,我喜欢你的解决方法。

我将添加一个功能请求,以便更轻松地完成此操作。尚不确定这会是什么样子,但是...感谢您提供的方案。

于 2013-08-09T16:55:49.953 回答