EF:Nullable对象的弹性比例查询必须具有值

时间:2016-12-13 14:13:56

标签: entity-framework azure-sql-database azure-elastic-scale

在Azure上,我设置了几个分片数据库和一个弹性查询数据库,外部表镜像分片上的表。我使用的两个主要表是:

  1. 渠道:
    • [Name] nvarchar NOT NULL,
    • [Id] [uniqueidentifier] NOT NULL,
    • [ExternalReference] nvarchar NULL
  2. 用户:
    • [电子邮件] 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
  3. 当我通过EF和linq查询时:

      

    var user = db.Users.Include(" Channel")。FirstOrDefault(u => u.Email ==   " tony@soprano.com");

    我收到错误:

      

    执行GlobalQuery操作时发生错误:Nullable对象必须具有值。

    这就是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频道ON CAST(Users.ChannelId as uniqueidentifier)= CAST(Channels.Id as uniqueidentifier)

    ChannelId和Id列已经是不可为空的uniqueidentifier。分片内的数据也是有效的而不是空的,那么究竟是什么问题呢?

    另一个问题:如何在linq中强制“强制转换为uniqueidentifier”?

1 个答案:

答案 0 :(得分:0)

快速提问,您说“直接通过T-SQL查询: SELECT * FROM Users INNER JOIN Channels ON Users.ChannelId = Channels.Id 给我同样的错误。“,你是从Elastic Query Head数据库查询还是在分片上查询?我设置了模式,在从分片查询时无法重新编写,所以我想知道我是不是在回复问题正确?