从EF6自动生成的类来实现自定义接口

时间:2017-12-01 12:44:05

标签: c# entity-framework inheritance

我正在使用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继承。“我错过了什么?

我认为这是因为它们不在同一名称空间中。有办法解决这个问题吗?

1 个答案:

答案 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