我有一个实体框架代码优先模型,其中一列未映射,我仍希望在服务器和客户端之间保留。该模型与此类似,具有更多属性:
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就在那里。我想让breeze通过元数据处理映射,但我希望能够在客户端和服务器之间传递SSN并跟踪它的状态,因为我需要在将其保存到数据库之前对其进行加密。 / p>
我尝试在提取元数据后添加它:
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.
也许我正在过度思考这个问题,并且有一种更简单的方法。我对任何建议持开放态度。
答案 0 :(得分:4)
我采用了不同的方法,并决定在服务器上运行时更改元数据。这就是我做到的。
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();
}
}
答案 1 :(得分:1)
实际上这是一个非常好的问题。 Breeze目前不支持在将EntityType添加到MetadataStore后修改它。但是根据您的方案,我看到了用例,我喜欢您的解决方法。
我将添加一个功能请求,以便更轻松地完成此操作。还不确定这会是什么样子,但是......谢谢你的情景。