На Azure у меня есть настройка нескольких оштукатуренных баз данных и эластичной базы запросов запросов с внешними таблицами, отражающими таблицы на осколках. Два основных таблиц, которые я использую:Запрос эластичной шкалы с EF: нулевой объект должен иметь значение
- Каналы:
- [Имя] NVARCHAR NOT NULL,
- [Id] [UniqueIdentifier] NOT NULL,
- [ExternalReference] NVARCHAR NULL
- Пользователи:
- [Email] NVARCHAR NOT NULL,
- [FirstName] NVARCHAR NOT NULL,
- [LastName] NVARCHAR NOT NULL,
- [ChannelId] [UniqueIdentifier] NOT NULL,
- [Status] [INT] NOT NULL,
- [AvatarId] [UniqueIdentifier] NULL,
- [Id] [UniqueIdentifier] NOT NULL
Когда я запрашиваю это с помощью EF и LINQ:
var user = db.Users.Include("Channel").FirstOrDefault(u => u.Email == "[email protected]");
Я получаю сообщение об ошибке:
An error occurred while executing GlobalQuery operation: Nullable object must have a value.
Это то, что выглядит класс пользователя как:
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
дает мне такая же ошибка.
Дальнейшее исследование показывает, что отливку Ids к uniqueidentifiers (что они уже есть) решает эту проблему:
SELECT * FROM Users INNER JOIN Channels ON CAST(Users.ChannelId as uniqueidentifier) = CAST(Channels.Id as uniqueidentifier)
Столбцы ChannelId и Id являются уже не обнуляемых uniqueidentifiers. Данные внутри осколков также действительны и не равны нулю, так что же здесь проблема?
Другой вопрос: как я могу заставить этот «cast to uniqueidentifier» в linq?
Можете ли вы показать класс, в котором вы сохраняете каждую строку из результата запроса? –