C# 指定的强制转换在读取时无效,但在插入作品时无效?
我有一个SQL表,如下所示,我有两个类:Incident和CircuitIncident。CircuitIncident派生自incident,并使用跟踪id引用FK和枚举-1,0,1,2的严重性枚举对其进行扩展 使用LINQtoSQL,我能够在表中存储一个事件。但是,当使用linq读取表时,我在foreach行得到以下异常: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>()
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; }
}
}