引用的一个可能的空参考实体在框架6查询

0

的问题

我有一个.净6项目与空引用类型的启用(<Nullable>enable</Nullable>). 我有这样的EF实体:

public class PostFile {
  public Int32 UserId { get; set; }
  public Int32 PostId { get; set; }

  public virtual User? User { get; set; }
  public virtual Post? Post { get; set; }
}

我加入 ? 上述防止这个可空的警告:

Non-nullable property '...' must contain a non-null value when exiting constructor. Consider declaring the property as nullable.

现在,我有这样的实体的框架6皇宫查询:

var postFiles = context.postFiles.Where(x => x.User.Id == request.UserId);

...但我得到的以下警告:

Dereference of a possibly null reference.

...在这一部分的我的查询:

x.User.Id == ...

我如何能解决这个警告?

4

最好的答案

2

我认为你的意思是这样的:

public class PostFile {
    public Int32 UserId{ get; set; }
    public Int32 PostId { get; set; }

    public virtual User? User { get; set; }
    public virtual Post? Post { get; set; }
}

你原来的问题是一个警告,C第8条中引入更加明确的与空,能够参考的类型。 对于一个实体,上述执行情况是无效的,除非这些关系确实可选择的,这将需要他们的FK领域(用户名和帐子id)也是无能。 他们可能是 可选的。

主要的选项,以解决这个:

A)关闭的特征。 (禁用空,能够参考的项目)

B)要求"宽恕"的事实,这应该永远是空的,但不会在一个有效的国家建设。 (EF会管理他们)

public class PostFile {
    public Int32 UserId{ get; set; }
    public Int32 PostId { get; set; }

    public virtual User User { get; set; } = null!;
    public virtual Post Post { get; set; } = null!;
}

改变模型的标志导航性能作为空以引用很可能引起的各种问题,如迁移可,并将开始更换非空,能够驻有空能的。 标记这些参考文献为无能和EF保持快乐:

public class PostFile {
    public Int32? UserId{ get; set; }
    public Int32? PostId { get; set; }

    public virtual User? User { get; set; }
    public virtual Post? Post { get; set; }
}

这几乎是肯定 是你想要在你领域,或甚至合法的,如果用户名和帐子id一部分的一PK。

就个人而言,我粉化的这一变化C#作为一个"地雷"MS启用初步默认情况下,如客户的侧评估在EF。 :) 我预见到很多-一个计算器的问题,围绕这个警告或重大更改,以及很多-一个客户代码基充斥着"!"宽恕标签,因为老年非空-物件/引用的是传递到代码用空,能够参考的检查。

2021-11-24 23:15:24
1

你应该标志着导航实体可为空。 你不应该偷懒装启用,因此导航性能够返回作为 null 从查询。 即使他们是需要在数据库,你的代码没有载它们。

在你的查询表,可以将某些实体框架是不要执行他们的客户方,但parse SQL query了他们。

因此:

.Where(x => x.User!.Id == request.UserId)

你可以告诉编译器 User! 你知道这不会是空在那里。 除非你能使客户方评估,但是你不应该的,如果你这样做,你需要一个空检查有无论如何。

至于使用 PostFile.User,如:

var postFile = dbContext.PostFiles.FirstOrDefault(p => p....) ?? throw ...;
var user = postFile.User;

有这可能 null 如果你没有 Include(p => p.User) 并没有偷懒装启用,所以 user 将需要一个空前检查使用情况。

如果你 使用延迟装载,则可以禁止的警告:

#pragma warning disable CS8618 // EF initializes these properties through lazy loading
    public virtual User User { get; set; }
#pragma warning restore CS8618 
2021-11-24 22:37:30
0

我觉得你需要这个:

public class PostFile {
    public User User { get; set; }
    public Post Post { get; set; }
}

和呼叫

var postFiles = context.postFiles.Where(x => x.User.Id == request.UserId).Include(x => x.Post);
2021-11-24 22:52:47

没有。 不标志着这些属性作为可空使编译器发出的警告,他们不可能已经被初始化了,这是真实的。
CodeCaster
0

怎么样 var postFiles = context.postFiles.Where(x => x.User != null && x.User.Id == request.UserId);?

2021-11-24 22:53:01

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................