Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.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# 指定的强制转换在读取时无效,但在插入作品时无效?_C#_Sql_Database_Linq_Linq To Sql - Fatal编程技术网

C# 指定的强制转换在读取时无效,但在插入作品时无效?

C# 指定的强制转换在读取时无效,但在插入作品时无效?,c#,sql,database,linq,linq-to-sql,C#,Sql,Database,Linq,Linq To Sql,我有一个SQL表,如下所示,我有两个类:Incident和CircuitIncident。CircuitIncident派生自incident,并使用跟踪id引用FK和枚举-1,0,1,2的严重性枚举对其进行扩展 使用LINQtoSQL,我能够在表中存储一个事件。但是,当使用linq读取表时,我在foreach行得到以下异常: var result = from eachIncident in db.Incidents.OfType<CircuitIncident>()

我有一个SQL表,如下所示,我有两个类:Incident和CircuitIncident。CircuitIncident派生自incident,并使用跟踪id引用FK和枚举-1,0,1,2的严重性枚举对其进行扩展

使用LINQtoSQL,我能够在表中存储一个事件。但是,当使用linq读取表时,我在foreach行得到以下异常:

var result = from eachIncident in db.Incidents.OfType<CircuitIncident>()
             where selectedTraceItems.Select(t => t.Id).Contains(eachIncident.CircuitTraceId)
             select eachIncident;

foreach(CircuitIncident circInc in result)
{
   //do something
}
堆栈跟踪:

System.Data.Linq.SqlClient.SqlProvider.Execute(Expression query, QueryInfo queryInfo,   IObjectReaderFactory factory, Object[] parentArgs, Object[] userArgs, ICompiledSubQuery[] subQueries, Object lastResult)
System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(Expression query, QueryInfo[] queryInfos, IObjectReaderFactory factory, Object[] userArguments, ICompiledSubQuery[] subQueries)
System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query)
System.Linq.IQueryProvider.Execute[TResult](Expression expression)
System.Linq.Queryable.First[TSource](IQueryable`1 source)
SmartVisionUnitTests.IncidentViewModelTest.testLoad() in Z:\SmartVision\SmartVision\SmartVisionTest\IncidentViewModelTest.cs: line 87
谢谢和问候


Andreas

好的,我自己解决了->我试图将枚举映射到一个DB smallint字段。如果我在DB上使用int,它就可以工作。我仍然感到奇怪,因为根据Microsoft文档,应该可以将枚举映射到smallint

是因为你在专栏里打字吗?嗯,你是什么意思?类型列是我的描述符,用于确定使用继承时要还原的类型。插入时,它会正确填充。您认为它可能有什么问题?默认情况下,C枚举是int。如果希望在数据库中使用smallint,则必须将枚举声明为short。公共枚举MyEnum:short{…}安迪,非常感谢!这解决了问题,我不需要在数据库上浪费空间。
System.Data.Linq.SqlClient.SqlProvider.Execute(Expression query, QueryInfo queryInfo,   IObjectReaderFactory factory, Object[] parentArgs, Object[] userArgs, ICompiledSubQuery[] subQueries, Object lastResult)
System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(Expression query, QueryInfo[] queryInfos, IObjectReaderFactory factory, Object[] userArguments, ICompiledSubQuery[] subQueries)
System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query)
System.Linq.IQueryProvider.Execute[TResult](Expression expression)
System.Linq.Queryable.First[TSource](IQueryable`1 source)
SmartVisionUnitTests.IncidentViewModelTest.testLoad() in Z:\SmartVision\SmartVision\SmartVisionTest\IncidentViewModelTest.cs: line 87
[Table(Name = "incident_tab")]
[InheritanceMapping(Code = "C", Type = typeof(CircuitIncident), IsDefault = true)]
public class Incident 
{
    public int Number { get; set; }

    [Column(IsDiscriminator = true)]
    private string TYPE;

    [Column(Name="POS")]
    public float Position { get; set; }

    public virtual float Size
    {
        get { return IncidentStop - IncidentStart; }
    }

    [Column(Name = "START")]
    public float IncidentStart { get; set; }

    [Column(Name = "STOP")]
    public float IncidentStop { get; set; }

    [Column(Name = "TIMESTAMP")]
    public virtual DateTime Date { get; set; }

    [Column(Name = "ID", IsPrimaryKey = true, IsDbGenerated = true)]
    private int id;
    public int Id
    {
        get { return id; }
        set { id = value; }
    }
}



public class CircuitIncident : Incident
{
    private int circuitTraceId = 0;

    [Column(Name="TRACE_ID")]
    public int CircuitTraceId
    {
        get { return circuitTraceId; }
        set { circuitTraceId = value; }
    }

    private AlarmStatusType severity = AlarmStatusType.Unknown;
    [Column(Name = "SEVERITY")]
    public AlarmStatusType Severity
    {
        get { return severity; }
        set { severity = value; }
    }
}