Breeze 在EntityType添加到数据存储区后,如何将其添加到EntityType?

Breeze 在EntityType添加到数据存储区后,如何将其添加到EntityType?,breeze,Breeze,我有一个实体框架代码优先模型,其中有一列未映射,我仍然希望在服务器和客户端之间持久化。该模型与此类似,具有更多属性: public class OwnerInformation { [Key] [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] public int Id { get; set; } [Required] [MaxLength(16)] public byt

我有一个实体框架代码优先模型,其中有一列未映射,我仍然希望在服务器和客户端之间持久化。该模型与此类似,具有更多属性:

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就在那里。我想让breeze通过元数据处理映射,但我希望仍然能够在客户端和服务器之间传递SSN,并跟踪它的状态,因为在将其保存到DB之前,我需要对其进行加密

我尝试在获取元数据后添加它,如下所示:

var ownerType = manager.metadataStore.getEntityType('OwnerInformation');
var sSN = new breeze.DataProperty({
  name: 'sSN',
  dataType: breeze.DataType.String,
  isNullable: false,
  maxLength: 9
});
ownerType.addProperty(sSN);
但是我得到了一个错误:
已经将“OwnerInformation:#Models”EntityType添加到元数据存储中,因此不能向其中添加其他属性。


也许我想得太多了,还有一个更简单的方法。我愿意接受任何建议。

我采取了不同的方法,决定在服务器上运行时更改元数据。我是这样做的

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();
  }
}
公共类MyContextProvider:EFContextProvider
{
受保护的重写字符串BuildJsonMetadata()
{
字符串元数据=base.BuildJsonMetadata();
JObject json=JObject.Parse(元数据);
var entityOwnerInfo=json[“schema”][“entityType”].Children()。其中(j=>(string)j[“name”]==“OwnerInformation”).SingleOrDefault();
var propertyArray=entityOwnerInfo[“property”]为Newtonsoft.Json.Linq.JArray;
JToken ssnPropertyType=JToken.Parse(@){
“名称”:“SSN”,
“”类型“”:“”Edm.String“”,
“fixedLength”:“true”,
“maxLength”:“9”,
“最小长度”:“9”,
“可为空”:“假”};
propertyArray.Add(ssnPropertyType);
返回json.ToString();
}
}

实际上这是一个非常好的问题。Breeze目前不支持在EntityType添加到元数据存储后修改它。但是通过您的场景,我看到了用例,我喜欢您的解决方案


我将添加一个功能请求,使这项工作更容易完成。还不确定这到底是什么样子,但是。。。谢谢你的剧本

呼。那是乔纳斯的妙计。正如Jay所说,我们一直在讨论放宽规则,即“一旦EntityType被添加到元数据中,就不能更改它”。现在我们有了另一个数据点。如果你有这个需要,这里是用户语音请求:它正在工作!现在我可以用Breeze将[NotMapped]字段提交到服务器。