Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#实体框架通过枚举将nvarchar转换为int时出错_C#_Entity Framework_Enums - Fatal编程技术网

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

C#实体框架通过枚举将nvarchar转换为int时出错,c#,entity-framework,enums,C#,Entity Framework,Enums,我收到以下错误时遇到问题: 将nvarchar值“HolidayRequest”转换为数据类型int时,转换失败。 我在实体框架中有一个继承结构。我的基本模型如下: public abstract class Request { public int ID { get; set; } public int EmployeeID { get; set; } public string Subject { get; set; } [Display(Name = "D

我收到以下错误时遇到问题:

将nvarchar值“HolidayRequest”转换为数据类型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;
    }
var test = _context.Requests.Where(r => r.EmployeeID == employeeId).OfType<AbsenceRequest>();
当我尝试按如下方式从数据库检索数据时:

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;
    }
var test = _context.Requests.Where(r => r.EmployeeID == employeeId).OfType<AbsenceRequest>();
实体框架发送的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])
任何帮助都将不胜感激,因为我完全被难倒了

更新


根据下面答案中的建议,我已经从数据库中删除了两个鉴别器列,并读取了我的。但是,SQL查询似乎仍在查找现在不存在的鉴别器1列。

看起来您在“鉴别器1”中有一个额外的列。您最初是否将该字段作为字符串,然后尝试将其转换为枚举?最好的选择可能是尝试完全删除字段,并确保它同时删除鉴别器和鉴别器1。然后试着把它加回去。这可能发生在具有自定义映射时,因此可能有问题。

我已经设法解决了这个问题。答案是删除我创建的鉴别器列,并允许EF通过在linq查询中包含类型来确定类型,如下所示:

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;
    }
var test = _context.Requests.Where(r => r.EmployeeID == employeeId).OfType<AbsenceRequest>();
var test=\u context.Requests.Where(r=>r.EmployeeID==EmployeeID).OfType();

类型()的名称似乎告诉EF查看此类型名称的鉴别器列,只返回该类型的数据。

可能是因为您的nvarchar值为'HolidayRequest',但您的枚举为'Holiday'?我可以在SQL中看到这一点,但我不知道这是从何而来,因此如何修复它可能需要调用您自己的列
鉴别器
不是一个好主意,尤其是与TPH结合使用。EF维护自己的
string
列,名为
Discriminator
,以区分派生类,因此它可能在某个地方被硬编码(只是猜测)。如果我从模型中删除属性并更新数据库,现在将检索该表中的所有记录。但是,如何只获取HolidayRequest而不是缺席请求?查看数据库,确保表中的两列都已删除。然后将该列添加回,并执行您正在执行的操作。出于某种原因,你刚才有一个额外的列需要删除。好的,我明天上班时会试试这个,如果行得通,我会接受你的回答。好的,我已经删除了鉴别器和鉴别器列。然后我读了我的鉴别器专栏。但是,查询仍在查找鉴别器1,并产生错误
无效列名'Discriminator1'
。有什么想法吗?