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