我一直试图在EF代码中保存一个复杂的实体 - 首先使用Json.NET几天没有成功。
[Major edit and tl; dr;:] 有没有办法将JSON对象反序列化为实体并保持它们的关系?
我可以按常规方式存储它。我的问题是在对对象进行反序列化之后。
按照设计,Preference
应添加到数据库中,但它们的Value
是外键(提供PreferenceValue
表)。
这是我的模型(为简洁而过于简化):
public class Preference {
public virtual ICollection<PreferenceAttribute> Attributes { get; set; }
}
public class PreferenceAttribute {
public virtual ICollection<Value> Values { get; set; }
}
public class Value {
public int ValueId { get; set; }
public string Description { get; set; }
}
在保存之前,值似乎没有附加到上下文,导致引擎存储新的Value
而不是使用JSON对象提供的外键,如下所示:
{
"PreferenceAttributes":[{
"PreferenceTypeId" : 1,
"Values":[
{
"ValueId" : 1
},
{
"ValueId" : 2
},
{
"ValueId" : 3
},
]
}]
}
我可以直接在C#中保存它而不会出现任何问题;我用来为偏好设定种子的“代码”:
var attribute = new PreferenceAttribute {
AttributeId = 1,
Values = context.Values.OrderBy(a => a.ValueId).Skip(1).Take(5).ToList();
};
var preferece = new Preference {
Attributes = new List<PreferenceAttribute> {
attribute
}
};
//user is fetched from "context" as well
user.Preferences.Add(preferece);
context.SaveChanges();
请记住,这只是Value
。如前所述,问题是新的Value
被添加到数据库而不是使用他们的Id
作为外键与PrefferenceAttribute
相关联,即EF正在考虑我想添加新的Value
,如下所示:
attribute.Values = new List<Value> {
new Value {
ValueId = 1, //This id will be ignored by EF since it's not fetched using context; new record will be inserted;
WhateverAttributes = "WTF"
}
}
最好的问候。
答案 0 :(得分:0)
我认为你的问题是现有记录没有引用外键记录,而是新创建和引用它们。
我认为发生此问题是因为您的所有实体都处于已添加状态。您可能希望外键记录处于Unchanged状态。 检查实体状态http://msdn.microsoft.com/en-us/data/jj592676.aspx
的此链接首先,我建议你将域模型与Dto分开。执行此操作后,您将在清除外键记录之前手动解析它们。