2014-12-11 2 views
0

Я пытался сохранить сложный объект в EF-коде, используя Json.NET в течение нескольких дней без успеха.Сохранить сложный объект с помощью EF от JSON

[Major edit and tl; dr ;:] Есть ли способ десериализовать объект JSON в сущность и сохранить свои отношения?

Я могу хранить его обычным способом. Моя проблема заключается в десериализации объекта.

По конструкции, Preference s должен добавлен в базу данных, но их Value s внешние ключи (дающие 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 s вместо использования внешних ключей, предоставляемых объект 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 s добавляются в базу данных вместо использования их Id s в качестве внешних ключей для связи с PrefferenceAttribute s, то есть EF думает, что я хочу добавить новые Value s, например:

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

Какие у вас проблемы? – rfornal

+1

Ваш JSON не соответствует (упрощенной) версии вашего кода, можете ли вы изменить пожалуйста :) – John

+0

Код, который вы используете, чтобы отличать/сохранять значения «Значения», скорее всего, там, где проблема. Если бы вы могли опубликовать этот код, это было бы полезно. – wahwahwah

ответ

0

Я думаю, что ваша проблема заключается в записи иностранных ключей, на которые не ссылается существующая запись, вместо этого они вновь создаются и ссылаются.

Я думаю, что проблема возникает из-за того, что все ваши объекты находятся в добавленном состоянии. Вы можете захотеть, чтобы ваши записи заграничного ключа в состоянии «Без изменений». Проверьте эту ссылку для состояний сущностей http://msdn.microsoft.com/en-us/data/jj592676.aspx

Прежде всего, я бы посоветовал вам отделить модель домена от Dto. Как только вы это сделаете, вы будете вручную удалять записи внешних ключей, прежде чем вы их выгружать.

+0

У меня уже есть мои домены и значения записываются как внешние ключи при использовании C#. Моя проблема находится в процессе десериализации объекта. – Casper

+0

Thats, потому что модель сущности, построенная из десериализации, не отслеживается EF. Все они входят в состояние добавленной сущности. Но когда вы загружаете PreferenceAttribute и ссылаетесь на них, атрибут PreferenceAttribute привязывается и находится в неизмененном состоянии. – Ahuman

+0

Да. Я знаю это.;) Я не уточнил: есть ли способ десериализировать объект, поддерживающий их отношения с помощью Json.NET? Я думаю, что мне придется сделать свой собственный десериализатор ... – Casper

Смежные вопросы