在Azure上,我设置了几个碎片数据库和一个带有外部表的弹性查询数据库,该数据库镜像碎片上的表。我使用的两个主要表是:
- 频道:
- [name] nvarchary not null,
- [id] [唯一识别器]不是null,
- [externalReference] nvarchar null
- 用户:
- [电子邮件] nvarchary not null,
- [firstName] nvarchary not null,
- [lastName] nvarchary not null,
- [ChannelID] [唯一识别器]不是null,
- [状态] [int]不是null,
- [avatarid] [unique Iddentifier] null,
- [id] [唯一识别器]不是null
当我通过EF和LINQ查询此问题时:
var user = db.users.include(" channel")。firstordEfault(u => u.email ==== " tony@soprano.com");
我有一个错误:
执行GlobalQuery操作时发生错误:无效对象必须具有一个值。
这是用户类的样子:
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查询:
从用户中选择 *从用户上的内在频道。Channelid= Channels.ID
给我相同的错误。
进一步的调查表明,将ID施放给独特的识别符(它们已经是)解决了问题:
从用户中选择 * cast(users.channelid作为唯一识别器)= cast(Channels.ID为unique IdentiDifier)
select *。
ChannelID和ID列已经是不可确定的唯一身份。碎片内的数据也有效,而不是零,那么这里的问题到底是什么?
另一个问题:我如何强制linq中的"投射到独特的识别器"?
快速问题,您指出"通过t-sql直接查询:从用户中选择 *内在连接频道。ChannelId= Channels.ID给我同样的错误。",您是从弹性查询头数据库中还是在碎片上查询?我设置了模式,在从碎片中查询时无法再现,所以我想知道我是否不重新读取问题正确?