C# 原始状态实例的类型错误

C# 原始状态实例的类型错误,c#,linq-to-sql,C#,Linq To Sql,我得到异常:invalidoOperationException:原始状态实例的类型错误。使用以下缩减代码的版本时: Table existing = context.Tables.Single(t => t.Key == derivedFromTable.Key); context.Tables.Attach((Table)derivedFromTable, existing); //thrown here context.SubmitChanges(); 其中,derivedFr

我得到异常:
invalidoOperationException:原始状态实例的类型错误。
使用以下缩减代码的版本时:

Table existing = context.Tables.Single(t => t.Key == derivedFromTable.Key);

context.Tables.Attach((Table)derivedFromTable, existing); //thrown here

context.SubmitChanges();
其中,
derivedFromTable是derivedFromTable
类derivedFromTable:Table

这个异常是什么意思(显然
((Table)derivedFromTable)是Table
,而
existing是Table
),我如何解决它?

由于
Attach()
方法已接受类型为
Table
的参数,因此加宽转换是隐式的

不过,这并不重要,因为Linq to SQL动态检查传入对象的类型,基本上它不支持将派生类型视为基本实体(还因为强制转换不会更改实例的实际类型,它只更改其静态接口)。因此,如果您想这样做,您需要首先使用AutoMapper之类的工具将派生实例的属性复制到基类型的实例。例如:

Table existing = context.Tables.Single(t => t.Key == derivedFromTable.Key);
Table table = Mapper.Map<DerivedFromTable, Table>(derivedFromTable);
context.Tables.Attach(table , existing);
context.SubmitChanges();
tableexisting=context.Tables.Single(t=>t.Key==derivedFromTable.Key);
Table Table=Mapper.Map(派生自Table);
context.Tables.Attach(表,现有);
context.SubmitChanges();

谢谢!幸运的是,我的
Table
类包含一个构造函数,它的类型为
Table
,所以现在我有
var updated=newtable(derivedFromTable)
然后执行
附加(更新的,现有的)
…这不起作用。。。我想我得走你的地图路线了。谢谢你接受。。。我不知道为什么你的解决方案不起作用,除非复制构造函数不能正常工作或者其他什么。如果您使用AutoMapper,请确保在应用程序启动期间的某个时间点执行
Mapper.CreateMap()
,否则您的映射将无法初始化,并且在尝试调用
Mapper.map()
时会出错。如果您使用AutoMapper,我不知道。我刚刚在本地制作了一个快速示例,当我执行
Mapper.Map(派生)
时,AutoMapper肯定会返回一个基类型的实例。很抱歉,我删除了之前的评论,因为您之前的评论没有出现,在我询问之前没有回答!