Azure では、複数のシャード データベースと、シャード上のテーブルをミラーリングする外部テーブルを含むエラスティック クエリ データベースをセットアップしています。私が使用する2つの主なテーブルは次のとおりです。
- チャネル:
- [名前] nvarchar NOT NULL,
- [ID] [一意の識別子] NOT NULL、
- [外部参照] nvarchar NULL
- ユーザー:
- [メール] nvarchar NOT NULL,
- [FirstName] nvarchar NOT NULL,
- [姓] nvarchar NOT NULL,
- [ChannelId] [一意の識別子] NOT NULL、
- [ステータス] [int] NOT NULL,
- [アバター ID] [一意の識別子] NULL、
- [ID] [一意の識別子] NOT NULL
EF と linq を介してこれをクエリすると、次のようになります。
var user = db.Users.Include("Channel").FirstOrDefault(u => u.Email == "tony@soprano.com");
エラーが発生します:
GlobalQuery 操作の実行中にエラーが発生しました: null 許容オブジェクトには値が必要です。
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 列は、既に null 非許容の uniqueidentifiers です。シャード内のデータも有効で null ではないので、ここでの問題は正確には何ですか?
別の質問: linq で「uniqueidentifier へのキャスト」を強制するにはどうすればよいですか?