在 Azure 上,我设置了几个分片数据库和一个弹性查询数据库,其中外部表镜像分片上的表。我使用的两个主要表是:
- 渠道:
- [名称] nvarchar 非空,
- [Id] [uniqueidentifier] 非空,
- [外部参考] nvarchar NULL
- 用户:
- [电子邮件] 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”?