Entity Framework — DbContext SaveChanges()

Может ли кто-нибудь сказать мне, возможно ли это, и если да, то как избежать использования двух раз _context.SaveChanges() в этом коде?

        Message m = new Message
        {
            Title = message.Title,
            Body = message.Body,
            Date = DateTime.Now
        };

        _context.Messages.Add(m);
        _context.SaveChanges();

        UserMessage messageToUser = new UserMessage
        {
            MessageID = m.ID,
            ProductID = message.ProductID,
            SenderID = message.SenderID,
            RecieverID = reciever.Id
        };

        _context.UserMessages.Add(messageToUser);
        _context.SaveChanges();

Вот так выглядят мои Сущности

public class UserMessage
{
    public int ID { get; set; }
    public string SenderID { get; set; }
    public string RecieverID { get; set; }
    public int? ProductID { get; set; }
    public int MessageID { get; set; }

    public User Sender { get; set; }
    public User Reciever { get; set; }
    public Product Product { get; set; }
    public Message Message { get; set; }
}

public class Message
    {
        public int ID { get; set; }
        public string Title { get; set; }
        public string Body { get; set; }
        public DateTime Date { get; set; }
    }

person IvanD    schedule 24.03.2016    source источник


Ответы (1)


В своем классе UserMessage вы устанавливаете ссылку вместо внешнего ключа, так как внешний ключ еще не известен.

В вашем коде это будет означать:

    Message m = new Message
    {
        Title = message.Title,
        Body = message.Body,
        Date = DateTime.Now
    };

    _context.Messages.Add(m);

    UserMessage messageToUser = new UserMessage
    {
        ProductID = message.ProductID,
        SenderID = message.SenderID,
        RecieverID = reciever.Id,
        Message = m
    };

    _context.UserMessages.Add(messageToUser);
    _context.SaveChanges();
person Gigabyte    schedule 24.03.2016
comment
Спасибо, дело было!! - person IvanD; 25.03.2016
comment
Разве сохраняемость EF не игнорируется, что означает: все измененные объекты сохраняются в точке фиксации в правильном порядке? Просто любопытно, потому что при работе с NHibernate попытки явного вызова вставки/обновления в БД для отдельных объектов являются распространенной ошибкой, кроме как в конце UnitOfWork (обычно с помощью Flush() или транзакции Commit()). Метод Save(object) в NHib на самом деле только прикрепляет объект к контексту сохраняемости (например, EF Add()), а не вызывает немедленную вставку/обновление. Добавление связанных объектов путем установки идентификатора также неверно в NHib, их следует добавлять, как описано в этом ответе. - person Erik Hart; 25.03.2016