Asp.net 如何在添加EF外键列后直接正确访问它?
我有一个基本的通知系统在我的网站上工作,我已经开始使它与SignalR实时工作,但我有困难访问我的外键到用户表 在我的一个页面中,我有以下生成新通知对象的代码Asp.net 如何在添加EF外键列后直接正确访问它?,asp.net,entity-framework,Asp.net,Entity Framework,我有一个基本的通知系统在我的网站上工作,我已经开始使它与SignalR实时工作,但我有困难访问我的外键到用户表 在我的一个页面中,我有以下生成新通知对象的代码 Notification NewNotification = new Notification { UserToId = u.UserId, NotificationText = "some text" }; db.Notifications.Add(NewNotification); db.SaveC
Notification NewNotification = new Notification
{
UserToId = u.UserId,
NotificationText = "some text"
};
db.Notifications.Add(NewNotification);
db.SaveChanges();
string name = NewNotification.UserFrom.DisplayName;
在最后一行,我得到System.NullReferenceException:对象引用未设置为对象的实例
当我通过signar将NewNotification传递给客户端并尝试访问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);
}
问题是:
如何在创建通知后访问该通知的UserFrom.DisplayName?保存后可能没有刷新您的实体。你也可以 1使用另一个查询从数据存储中重新获取它。如果通知具有某种标识列,则它将在NewNotification对象的SaveChanges上更新。该id可用于检索对象。比如NewNotification=db.Notifications.Singlex=>x.Id==NewNotification.Id 2如果您讨厌上述选项,您可以这样做: IObjectContextAdapterdb.ObjectContext.RefreshRefreshMode.ClientWins,NewNotification;这将更新您的NewNotification对象。不太好看,但我最近遇到了一个类似的问题,它对我起了作用 < P > 3,因为您已经在范围内使用了USERID,所以我将考虑做一个dc.UrS.SunLex= > x.UsIDID=U.USERID。 如果您想通过NewNotification对象访问用户,我个人喜欢选项2,因为它更清楚您的意图。。。。您希望根据数据库刷新NewNotifications对象,并且希望客户端中与您的对象不匹配的任何内容都能获胜
我认为选项3也许是最干净的,但这是你的选择 当我尝试访问UserFrom.DisplayName时,第一个选项也给了我一个空引用异常。第二个选项给了我System.Data.Linq.Refreshmode不包含ClientWins的定义,所以我不得不使用您给我的第三个选项,这不是我真正想要的,但它完成了任务。不同版本的entity framework处理选项2的方式可能与其他版本不同。。。。我想我会调查的。很高兴听到备选方案3成功: