1

Azure では、複数のシャード データベースと、シャード上のテーブルをミラーリングする外部テーブルを含むエラスティック クエリ データベースをセットアップしています。私が使用する2つの主なテーブルは次のとおりです。

  1. チャネル:
    • [名前] nvarchar NOT NULL,
    • [ID] [一意の識別子] NOT NULL、
    • [外部参照] nvarchar NULL
  2. ユーザー:
    • [メール] 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 へのキャスト」を強制するにはどうすればよいですか?

4

1 に答える 1