Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 如何在添加EF外键列后直接正确访问它?_Asp.net_Entity Framework - Fatal编程技术网

Asp.net 如何在添加EF外键列后直接正确访问它?

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

我有一个基本的通知系统在我的网站上工作,我已经开始使它与SignalR实时工作,但我有困难访问我的外键到用户表

在我的一个页面中,我有以下生成新通知对象的代码

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成功: