1

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

  1. 渠道:
    • [名称] nvarchar 非空,
    • [Id] [uniqueidentifier] 非空,
    • [外部参考] nvarchar NULL
  2. 用户:
    • [电子邮件] nvarchar 不为空,
    • [名字] nvarchar 非空,
    • [姓氏] nvarchar 非空,
    • [ChannelId] [uniqueidentifier] 非空,
    • [状态] [int] 非空,
    • [AvatarId] [uniqueidentifier] NULL,
    • [Id] [uniqueidentifier] 非空

当我通过 EF 和 linq 查询时:

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

我收到一个错误:

执行 GlobalQuery 操作时出错:可空对象必须有值。

这是 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 Channels ON CAST(Users.ChannelId as uniqueidentifier) = CAST(Channels.Id as uniqueidentifier)

ChannelId 和 Id 列已经是不可为空的唯一标识符。分片内的数据也是有效的,不为空,那么这里到底有什么问题呢?

另一个问题:如何在 linq 中强制“转换为 uniqueidentifier”?

4

1 回答 1

0

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

于 2016-12-20T18:50:36.407 回答