繁体   English   中英

从EF6自动生成的类以实现自定义界面

[英]Auto-generated class from EF6 to implement custom interface

我正在使用EF6。我在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。” 我想念什么?

我猜想是因为它们不在同一个命名空间中。 有没有办法解决这个问题?

我可能会误解了您对名称空间的评论,但为清楚起见,Partial类实际上是位于对应部分类的相同名称空间中的部分类,否则您只是两个单独的具有相同名称的单个类自称是偏爱的。 在这种情况下,修复很简单。 将它们放在相同的名称空间中。

但是,更可能是由于将EntityObject添加到类层次结构中,如oerkelens所述。 EF 6创建POCO的代理,因此,您的类必须具有无参数的构造函数。 添加另一个类可能会阻止db上下文创建对象的代理。

从层次结构中仅删除该类,检查是否可以实现这些实体以进行验证或排除。

编辑 -不,这绝对是由于EntityObject

我通过首先让我的实体在部分类中实现一些接口来重现此问题。 效果很好。 然后,我从EntityObject继承了部分类,但由于您的错误而失败。

重现此错误后,我创建了一个名为MyStupidClass的类,并用MyStupidClass替换了EntityObject ,我仍然可以实现实体(即使具有EntityObject的顶级属性)。

因此,这取决于您引入层次结构的类。

class Program
{
    static void Main(string[] args)
    {
        using (var db = new schedulerEntities())
        {
            var schedules = db.Schedules.ToArray();
            foreach (var schedule in schedules)
            {
                Console.WriteLine($"{schedule.Cron} - {schedule.FriendlyDescription}");
            }
        }
        Console.ReadLine();
    }

}
public partial class Schedule: MyStupidClass, IScheduler
{
    public string FirstName { get; set; }
}

public class MyStupidClass
{
    public EntityKey EntityKey { get; set; }
    public EntityState State { get; set; }
}

interface IScheduler
{
    long Id { get; set; }
    string Name { get; set; }
    string Cron { get; set; }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM