繁体   English   中英

C#实体框架错误通过枚举将nvarchar转换为int

[英]C# Entity Framework Error Converting nvarchar to int by enum

我遇到以下错误:

Conversion failed when converting the nvarchar value 'HolidayRequest' to data type int.

我在实体框架中有一个继承结构。 我的基本模型如下:

public abstract class Request
{
    public int ID { get; set; }
    public int EmployeeID { get; set; }
    public string Subject { get; set; }

    [Display(Name = "Date Requested")]
    public DateTime DateRequested { get; set; }
    [Display(Name = "Start Date")]
    public DateTime StartDateTime { get; set; }
    [Display(Name = "Return To Work Date")]
    public DateTime EndDateTime { get; set; }
    public RequestStatus Status { get; set; }
    public string Notes { get; set; }
    public int? ResponseID { get; set; }
    public RequestDiscriminator Discriminator { get; set; }

    [ForeignKey("EmployeeID")]
    public virtual Employee Employee { get; set; }
    [ForeignKey("ResponseID")]
    public virtual Response Response { get; set; }
}

当我尝试从数据库中检索数据时,如下所示:

    public IQueryable<Request> GetPendingHolidayRequestsByEmployeeId(int employeeId)
    {
        var list = _context.Requests.Where(p => p.Discriminator == RequestDiscriminator.Holiday && p.EmployeeID == employeeId && p.Status == RequestStatus.NotProcessed);
        return list;
    }

这是发生错误的地方。

考虑到错误的上下文,我认为此枚举public RequestDiscriminator Discriminator { get; set; } public RequestDiscriminator Discriminator { get; set; }

枚举的结构为:

public enum RequestDiscriminator
{
    Holiday,
    Absence
}

实体框架发送的SQL语句为:

SELECT 
[Extent1].[ID] AS [ID], 
CASE WHEN ([Extent1].[Discriminator1] = N'AbsenceRequest') THEN '0X0X' ELSE '0X1X' END AS [C1], 
[Extent1].[EmployeeID] AS [EmployeeID], 
[Extent1].[Subject] AS [Subject], 
[Extent1].[DateRequested] AS [DateRequested], 
[Extent1].[StartDateTime] AS [StartDateTime], 
[Extent1].[EndDateTime] AS [EndDateTime], 
[Extent1].[Status] AS [Status], 
[Extent1].[Notes] AS [Notes], 
[Extent1].[ResponseID] AS [ResponseID], 
[Extent1].[Discriminator] AS [Discriminator]
CASE WHEN ([Extent1].[Discriminator1] = N'AbsenceRequest') THEN [Extent1].[ReasonCode] END AS [C2], 
CASE WHEN ([Extent1].[Discriminator1] = N'AbsenceRequest') THEN [Extent1].[TakenPaid] END AS [C3], 
CASE WHEN ([Extent1].[Discriminator1] = N'AbsenceRequest') THEN CAST(NULL AS float) ELSE [Extent1].[TotalDays] END AS [C4], 
CASE WHEN ([Extent1].[Discriminator1] = N'AbsenceRequest') THEN [Extent1].[Employee_EmployeeID] END AS [C5], 
CASE WHEN ([Extent1].[Discriminator1] = N'AbsenceRequest') THEN CAST(NULL AS int) ELSE [Extent1].[Employee_EmployeeID1] END AS [C6]
FROM [dbo].[Request] AS [Extent1]
WHERE ([Extent1].[Discriminator1] IN (N'AbsenceRequest',N'HolidayRequest')) AND (0 = [Extent1].[Discriminator]) AND (0 = [Extent1].[Status])

任何帮助将不胜感激,因为我完全陷入了困境。

UPDATE

按照下面答案的建议,我从数据库中删除了两个Discriminator列,并读取了我的。 但是,SQL查询似乎仍在寻找Discriminator1列,该列现在不存在。

我设法解决了这个问题。 答案是删除我创建的discriminator列,并允许EF通过在linq查询中包括以下类型来确定类型:

var test = _context.Requests.Where(r => r.EmployeeID == employeeId).OfType<AbsenceRequest>();

OfType <>()似乎告诉EF查看该类型名称的Discriminator列,并且仅返回该类型的数据。

看起来您在“ Discriminator1”中有一个额外的列。 您最初是否将该字段作为字符串,然后尝试将其转换为枚举? 最好的选择是尝试完全删除该字段,并确保同时删除Discriminator和Discriminator1。 然后尝试重新添加。 当具有自定义映射时,可能会发生这种情况,因此可能会出现问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM