Как я могу правильно получить доступ к столбцу внешнего ключа EF сразу после его добавления?

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

У меня есть следующий код на одной из моих страниц, который генерирует новый объект Notification

Notification NewNotification = new Notification
{
 UserToId = u.UserId,
 NotificationText = "some text"
};
db.Notifications.Add(NewNotification);
db.SaveChanges();
string name = NewNotification.UserFrom.DisplayName;

В последней строке я получаю System.NullReferenceException: Object reference not set to an instance of an object

Когда я передаю NewNotification через SignalR клиенту и пытаюсь получить доступ к NewNotification.UserFrom.DisplayName консоль js сообщает мне, что NewNotification.UserFrom не определен. Это происходит, несмотря на то, что я могу получить доступ к нему на странице макета после добавления уведомлений.

Соответствующие части моей модели для моего уведомления следующие.

public class Notification
{
 public Notification()
 {
 this.UserFromId = WebSecurity.CurrentUserId;
 }

 [Key]
 public int NotificationId { get; set; }

 public int UserToId { get; set; }
 public int UserFromId { get; set; }

 public virtual UserProfile UserTo { get; set; }
 public virtual UserProfile UserFrom { get; set; }

 [MaxLength]
 public string NotificationText { get; set; }
}

И тогда мой контекст db имеет следующие настройки для установления отношения внешнего ключа

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
 modelBuilder.Entity<notification>()
 .HasRequired(n => n.UserFrom)
 .WithMany(u => u.NotificationsFrom)
 .HasForeignKey(n => n.UserFromId)
 .WillCascadeOnDelete(false);

 modelBuilder.Entity<notification>()
 .HasRequired(n => n.UserTo)
 .WithMany(u => u.NotificationsTo)
 .HasForeignKey(n => n.UserToId)
 .WillCascadeOnDelete(false);
}
</notification></notification>

Вопрос в том:

Как я могу получить доступ к UserFrom.DisplayName уведомления сразу после его создания?

1 ответ

вполне вероятно, что ваш объект не обновляется после сохранения. вы также можете

1) вытащите его из хранилища данных с помощью другого запроса. Если в Notification есть какой-то столбец Identity, он будет обновлен в SaveChanges() в вашем объекте NewNotification. Этот идентификатор можно использовать для извлечения объекта. (Что-то вроде NewNotification = db.Notifications.Single(x => x.Id == NewNotification.Id)

2) Если вы ненавидите вышеупомянутый вариант, вы можете сделать что-то вроде этого: ((IObjectContextAdapter)db).ObjectContext.Refresh(RefreshMode.ClientWins, NewNotification); Это обновит ваш объект NewNotification. Не очень, но в последнее время я столкнулся с проблемой, подобной этому, и это сработало для меня.

3) поскольку у вас уже есть идентификатор пользователя в области видимости, я бы подумал о том, чтобы сделать db.Users.Single(x => x.UserId == u.UserId).DisplayName

Если вы хотите получить доступ к Пользовательу через объект NewNotification, мне лично нравится вариант 2, потому что он становится немного понятнее, каковы ваши намерения... Вы хотите обновить объект NewNotifications от базы данных и хотите, чтобы все, что находится в клиенте, не соответствует вашему объекту "WIN".

Я думаю, что вариант 3, пожалуй, самый чистый, но его зов!

licensed under cc by-sa 3.0 with attribution.