2017-01-29 14 views
0

Я периодически синхронизирую данные на странице ASP.NET. У меня есть объект с двумя сложными элементами, которые я игнорирую в Entity Framework, используя атрибут NotMapped. Вместо этого я храню сериализованные значения.EF: Non-nullable UpdateException для свойства NotMapped

Модели:

public class Game 
{ 
    //... 
    [NotMapped] 
    public Image Image { get; set; } 

    [NotMapped] 
    public List<Image> Images { get; set; } 

    public string Image_Serialized 
    { 
     get 
     { 
      return JsonConvert.SerializeObject(Image); 
     } 
     set 
     { 
      Image = JsonConvert.DeserializeObject<Image>(value); 
     } 
    } 

    public string Images_Serialized 
    { 
     get 
     { 
      return JsonConvert.SerializeObject(Images); 
     } 
     set 
     { 
      Images = JsonConvert.DeserializeObject<List<Image>>(value); 
     } 
    } 
    //... 
} 

И ...

public class Image 
{ 
    public string IconUrl { get; set; } 
    public string MediumUrl { get; set; } 
    public string ScreenUrl { get; set; } 
    public string SmallUrl { get; set; } 
    public string SuperUrl { get; set; } 
    public string ThumbUrl { get; set; } 
    public string TinyUrl { get; set; } 
} 

Когда моя синхронизация завершена, я обновить свою базу данных:

foreach(var game in games) 
{ 
    // address any null complex types. 
    if (game.Image == null) game.Image = new Image(); 
    if (game.Images == null) game.Images = new List<Image>(); 

    // add game if new, update if already in db 
    var dbGame = db.Games.Where(g => g.Id == game.Id).FirstOrDefault(); 

    if (dbGame == null) 
    { 
     db.Games.Add(game); 
    } 
    else 
    { 
     var queriedGame = db.Entry(dbGame); 
     queriedGame.CurrentValues.SetValues(game); 
     queriedGame.State = System.Data.Entity.EntityState.Modified; 
    } 

} 

// returns 0 results... seems fine 
var badGames = games.Where(g => g.Image == null || g.Images == null).ToList(); 

db.SaveChanges(); 

Я получаю следующее исключение в БД. SaveChanges():

Server Error in '/' Application. 

Null value for non-nullable member. Member: 'Image'. 

Благодарим за помощь. Кроме того, почему мне нужно беспокоиться о том, что эти значения равны нулю, если я не ожидаю, что их значения будут непосредственно сохранены в атрибуте db (NotMapped)?

+0

В чем причина сохранения изображения как сериализованной строки, а затем идентификатора изображения в игровом объекте? –

+0

проверить таблицу игр, если у нее есть столбец Image? –

+0

@AliBaig Это не то, что происходит. Существует изображение с изображением и список связанных изображений. Это все URL-адреса, которые ссылаются на изображения на внешнем сервере. Отображаемое изображение не обязательно существует в соответствующем списке. –

ответ

0

Возможно, вам нужно использовать изображение? вместо изображения в качестве типа данных.

+0

Можете ли вы уточнить? Я не следую ... Изображение - абстрактный тип данных, который я создал. –

+0

Знаете ли вы о типах с нулевым значением в C#? Проверьте документацию здесь https://msdn.microsoft.com/en-us/library/1t3y8s4s.aspx –

+0

Да, но типы с нулевым значением предназначены для объектов, которые не могут быть обнуляемы (структуры, примитивы и т. Д.). Это объект, который по своей природе является нулевым. Я не уверен, как это мне поможет. Могли бы вы объяснить? –

1

Я бы не советовал вам использовать такую ​​модель вместо идентификатора изображения в вашем игровом классе с изображениями ICollection (по крайней мере, почему у них обоих есть).

Сказав, что с текущей моделью, вы можете попробовать что-то вроде

public class Game 
{ 
    //... 
    [NotMapped] 
    public Image? Image { get; set; } //<== see ? to make it nullable 

    [NotMapped] 
    public List<Image> Images { get; set; } 

    public string Image_Serialized 
    { 
     get 
     { 
      if(Image == null) 
       return null; 
      return JsonConvert.SerializeObject(Image); 
     } 
     set 
     { 
      if(value == null) 
       Image = null; 
      else 
       Image = JsonConvert.DeserializeObject<Image>(value); 
     } 
    } 
} 
+0

Я сделаю это. Почему изображение не имеет значения по умолчанию? Это объект.Это просто украшение для EF, чтобы понять? Лучший вопрос. Почему структура сущности заботится о том, является ли изображение нулевым, если оно не указано? –

+0

Изображение в настоящее время является объектом, что означает, что он уже обнуляется по определению. Добавление? украшение дает мне ошибку «Изображение должно быть типом с нулевым значением». Для этого требуется, чтобы я использовал структуру (тип с непустым значением). Я могу попробовать это, но для этого я использую библиотеку другого человека. Я бы предпочел не менять свой объект на структуру. –

0

+1 к Али для отправки меня в правильном направлении.

После изменения изображения на структуру и присвоения значения изображения значение null, у меня все еще была ошибка. Проблема заключалась в том, что объект Game ссылался на ряд других типов объектов (Developer, Publisher, Release и т. Д.). Некоторые из этих объектов содержали ссылки на изображения, которые я еще не установил для NotMapped. Моя гипотеза заключается в том, что когда я вызывал db.SaveChanges(), он пытался добавить записи в эти таблицы данных и вызывать проблемы.