2016-11-09 2 views
0

У меня есть вопрос относительно обновления существующих пользователей новыми данными с использованием EntityFramework и Domain Models. Или на самом деле больше похоже на проблему.EntityFramework не сохраняет новые данные об объекте

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

Так мы имеем IUserModel здесь:

public interface IUser 
{ 
    int ID { get; } 
    List<IOrder> Orders { get; } 
} 

И сущность UserEntity здесь:

public class UserEntity 
{ 
    int ID { get; set; } 
    public List<OrderEntity> Orders { get; set; } 
} 

Мы услуга называется PersistenceService здесь:

public async Task<bool> UpdateInformation(IUser user) 
{ 
    using (var databaseContext = new DatabaseContext()) 
    { 
     var userEntity = await database.Users.Include(u => u.Orders) 
          .FirstOrDefaultAsync(x => x.ID == user.ID); 

     userEntity.Orders = user.Orders.ToEntity(); // Extension (convert to entity)   
     databaseContext.Entry(userEntity).State 
         = EntityState.Modified; // Do we need this? 
     databaseContext.Entry(userEntity.Orders).State 
         = EntityState.Modified; // Do we need this? 

     await databaseContext.SaveChangesAsync(); 
    } 
} 

таблиц в базе данных выглядят так:

Orders          User 
--------         -------- 
int ID          int ID 
Money Price 
int UserId -- foreign key to user that owns this order  

Edit: В какой-то момент, когда пользователь хочет создать заказ, мы называем это сделать:

public async void AddNewOrder(IOrder order) 
{ 
    IUser user = GetActiveUser(); // This just return an IUser 
    var persistenceService = GetPersistenceService(); // returns instance of persistence service 

    user.Orders.Add(order); 
    await persistenceService.UpdateInformation(user); 
} 

Редактировать 09-11-2016: После дополнительной отладки, это выглядит как линия:

await persistenceService.UpdateInformation(user); 

Никогда не возвращается, это не изменяется при изменении кода для запуска синхронизации тоже. Так что это не проблема с резьбой.

+0

Как вы называете этот метод? Вам нужно предоставить время для SaveChangesAsync для работы. Вы пробовали UpdateInformation(). GetAwaiter(). GetResult()? –

+0

Как сказал DavidG, вы просто обновляете заказ, не связывая его с пользователем. –

+0

Хорошо, поэтому я сделал редактирование, чтобы показать, как заказ добавлен пользователю, а также @RicardoPeres не помогает, проблема не решена путем выполнения синхронной работы. – Nicholas

ответ

1

Вы перекрывая список заказов в этом заявлении:

userEntity.Orders = user.Orders.ToEntity(); // Extension (convert to entity) 

Я довольно уверен, что это то, что портит материал. Если вы измените линию на:

userEntity.Orders.AddRange(user.Orders.ToEntity()); 

Я считаю, что это должно сработать. Однако это всегда добавляет все заказы клиенту как новые. Если это не то, что вы хотите, вы можете использовать комбинацию вызовов «Добавить и удалить», чтобы обновлять коллекцию «Заказы», ​​а не просто добавлять их. Но просто проверить, сохраняет ли он что-либо, вы можете просто использовать AddRange().

Кроме того, вы не должны устанавливать состояние сущностей, если вы не прикрепляете их (а какие нет). Поэтому оставьте эти строки

 databaseContext.Entry(userEntity).State 
        = EntityState.Modified; // Do we need this? 
    databaseContext.Entry(userEntity.Orders).State 
        = EntityState.Modified; // Do we need this? 
+0

Я так не думаю, что это также дублирует записи уже в Заказе - правильно? – Nicholas

+0

В этом случае может быть недостаточно простого AddRange, и может потребоваться несколько более сложный механизм синхронизации, но я считаю, что переписывание свойства Orders является причиной вашей проблемы. Просто добавьте новые значения, обновите существующие и удалите их. Я почти уверен, что это сработает. Если вы сначала сделаете AddRange, вы получите дубликаты, но это простой способ увидеть, сохраняются ли Заказы вообще. – Robba

+0

Эй @ Робба, я попробовал ваше решение, но это тоже не помогло, никаких изменений. Проблема заключается в том, что databaseContext.SaveChanges(); никогда не возвращается – Nicholas

0

Проблема в том, что обновление Пользователя не поможет. Вам необходимо принудительно обновить Заказы, содержащие ссылку на пользователя, IMO. Не добавляйте их, принудительно обновляйте, устанавливая состояние в DbEntry.

+0

Здравствуйте, спасибо за ваш ответ. Я отлаживал немного дальше и выглядит как строка databaseContext.SaveChanges() никогда не возвращается (не асинхронно или синхронно) – Nicholas

+0

Может быть, это тупик транзакции? –

+0

Не можете ли вы контролировать SQL, добавив ctx.Database.Log + = Console.WriteLine? –

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