【问题标题】:Auto-generated class from EF6 to implement custom interface从 EF6 自动生成的类以实现自定义接口
【发布时间】:2017-12-01 12:44:04
【问题描述】:

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

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

【问题讨论】:

  • 你让它继承自EntityObject,并且你的错误信息明确指出验证类型[...]不继承自EntityObject。所以它不会映射,因为你让它继承自一个类,根据消息,它应该不是继承自。

标签: c# entity-framework inheritance


【解决方案1】:

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

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

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

编辑 - 不,肯定是因为EntityObject

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

重现此错误后,我创建了一个名为 MyStupidClass 的类,并将 EntityObject 替换为 MyStupidClass,我仍然可以实现实体(即使使用 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; }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 2018-09-06
    相关资源
    最近更新 更多