在Azure上,我设置了几个分片数据库和一个弹性查询数据库,外部表镜像分片上的表。我使用的两个主要表是:
当我通过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转换为uniqueidentifiers(它们已经是)已经解决了这个问题:
SELECT * FROM Users INNER JOIN频道ON CAST(Users.ChannelId as uniqueidentifier)= CAST(Channels.Id as uniqueidentifier)
ChannelId和Id列已经是不可为空的uniqueidentifier。分片内的数据也是有效的而不是空的,那么究竟是什么问题呢?
另一个问题:如何在linq中强制“强制转换为uniqueidentifier”?
答案 0 :(得分:0)
快速提问,您说“直接通过T-SQL查询: SELECT * FROM Users INNER JOIN Channels ON Users.ChannelId = Channels.Id 给我同样的错误。“,你是从Elastic Query Head数据库查询还是在分片上查询?我设置了模式,在从分片查询时无法重新编写,所以我想知道我是不是在回复问题正确?