使用来自JSON的EF保存复杂实体

时间:2014-12-11 23:55:49

标签: c# json entity-framework json.net

我一直试图在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"
    }
}

最好的问候。

1 个答案:

答案 0 :(得分:0)

我认为你的问题是现有记录没有引用外键记录,而是新创建和引用它们。

我认为发生此问题是因为您的所有实体都处于已添加状态。您可能希望外键记录处于Unchanged状态。 检查实体状态http://msdn.microsoft.com/en-us/data/jj592676.aspx

的此链接

首先,我建议你将域模型与Dto分开。执行此操作后,您将在清除外键记录之前手动解析它们。