我正在使用EF 6.我在db中有一个表,自动生成的类看起来像这样:
public partial class tblPreparation
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public tblPreparation()
{
this.tblPreparationItem = new HashSet<tblPreparationItem>();
}
public int id { get; set; }
public string name { get; set; }
public System.DateTime date { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<tblPreparationItem> tblPreparationItem { get; set; }
}
在我的代码中,我希望这个类扩展另一个类EntityObject,它位于命名空间System.Data.Entity.Core.Objects.DataClasses中(并实现另一个接口)。所以我创建了这个部分类:
public partial class tblPreparation : EntityObject, IMyInterface
{
}
它不会抛出语法错误,但是当我运行应用程序时,我得到运行时错误:“未映射类型'tblPreparation'。使用Ignore方法或NotMappedAttribute数据注释检查未明确排除类型验证类型是否已定义为类,不是原始类型还是通用类型,并且不从EntityObject继承。“我错过了什么?
我认为这是因为它们不在同一名称空间中。有办法解决这个问题吗?
答案 0 :(得分:2)
我可能误解了你对命名空间的评论,但为了清楚起见,Partial类实际上只是一个部分类,当它在相应的部分类的相同命名空间中时,否则你只有两个独立的单个类声称偏爱的同名。如果是这种情况,修复很简单。将它们放在相同的命名空间中。
但是,正如oerkelens所提到的,更有可能是因为将EntityObject添加到类层次结构中。 EF 6会创建POCO的代理,因此您的类必须具有无参数构造函数。添加另一个类可能会阻止db上下文创建对象的代理。
从层次结构中删除该类,检查您是否可以实现这些实体以验证或排除它。
修改 - 不,这肯定是由于.png
。
我通过首先让我的实体在部分类中实现一些接口来重现这一点。这很有效。然后我从if (PfFoto != null)
{
var newFileName = changePF.Name + Path.GetExtension(PfFoto.FileName);
var path = System.IO.Path.Combine(Server.MapPath("/images/PFfotos"), newFileName);
PfFoto.SaveAs(path);
}
继承了部分类继承错误。
在重现此错误后,我创建了一个名为EntityObject
的类,并将EntityObject
替换为MyStupidClass
,我仍然可以实现实体(即使是EntityObject
的顶级属性)。
所以这取决于你引入层次结构的类。
MyStupidClass