首页 文章

使用EF的弹性比例查询:Nullable对象必须具有值

提问于
浏览
1

在Azure上,我设置了几个分片数据库和一个弹性查询数据库,外部表镜像分片上的表 . 我使用的两个主要表是:

  • Channels :

  • [名称] nvarchar NOT NULL,

  • [Id] [uniqueidentifier] NOT NULL,

  • [ExternalReference] nvarchar NULL

  • 用户:

  • [电子邮件] nvarchar NOT NULL,

  • [FirstName] nvarchar NOT NULL,

  • [LastName] nvarchar NOT NULL,

  • [ChannelId] [uniqueidentifier] NOT NULL,

  • [状态] [int] NOT NULL,

  • [AvatarId] [uniqueidentifier] NULL,

  • [Id] [uniqueidentifier] NOT NULL

当我通过EF和linq查询时:

var user = db.Users.Include(“Channel”) . FirstOrDefault(u => u.Email ==“tony@soprano.com”);

我收到一个错误:

执行GlobalQuery操作时发生错误:Nullable对象必须具有值 .

这就是User类的样子:

public class User  
{  
    public Guid Id { get; set; } = SequentialGuid.NewGuid();  
    [Required]  
    public string Email { get; set; }  
    [Required]  
    public string FirstName { get; set; }    
    [Required]    
    public string LastName { get; set; }  
    [Index]  
    public Status Status { get; set; }  
    public Guid? AvatarId { get; set; }  
    [Index]  
    public Guid ChannelId { get; set; }  
    [ForeignKey("ChannelId")]  
    public virtual Channel Channel { get; set; }  
}

通过T-SQL直接查询:

SELECT * FROM Users INNER JOIN Channels ON Users.ChannelId = Channels.Id

给了我同样的错误 .

进一步的调查表明,将ID转换为uniqueidentifier(它们已经是)已经解决了这个问题:

SELECT * FROM Users INNER JOIN Channels ON CAST(Users.ChannelId as uniqueidentifier)= CAST(Channels.Id as uniqueidentifier)

ChannelId和Id列已经是不可为空的uniqueidentifier . 分片内的数据也是有效的而不是空的,那么究竟是什么问题呢?

另一个问题:如何在linq强制执行'cast into uniqueidentifier'?

1 回答

  • 0

    快速提问,你说“直接通过T-SQL查询:SELECT * FROM Users INNER JOIN Channels ON Users.ChannelId = Channels.Id给了我同样的错误 . ” ,您是从Elastic Query Head数据库查询还是在分片上查询?我设置了架构,在从分片查询时无法重新编写,所以我想知道我是不是正确地重新解决了这个问题?

相关问题