【问题标题】:Entity Framework Context.Set<T> throwing error "Entity type 'ClassName' is not part of the model for the current context"实体框架 Context.Set<T> 抛出错误“实体类型 'ClassName' 不是当前上下文模型的一部分”
【发布时间】:2020-04-21 09:09:44
【问题描述】:

我有 2 个类代表数据库中的同一个表,不同之处在于这些类的属性。我之所以使用这种方式,是因为应用程序将连接到的数据库中的自定义字段存在差异。

 [Table("T1")]
    public class Class1
    {
      .
      .
    }



 [Table("T1")]
        public class Class2
        {
          .
          .
        }

这里现在我使用 set 方法来获取数据。我没有在 DB 上下文中声明任何内容。

DbSet<Class1> set = context.Set<Class1>();
return set.Where(p => p.Active == "Y");

但是系统报错

'实体类型'Class1'不是当前上下文模型的一部分'

我想要实现的是动态定义 DbSet 的模型,这可能以其他方式吗?

【问题讨论】:

  • 您的上下文中是否有DbSet&lt;Class1&gt; 类型的 DbSet?
  • 即使我有 table 属性,我也必须包含它?那么我应该如何动态更改要使用的类呢?就像在某些情况下我必须使用class1,其他情况下使用class2。
  • 您始终需要在您的上下文中匹配DbSet。它怎么可能在两个班级之间改变,这没有意义?你的数据库不会突然改变吧?
  • 所以同一个应用程序将用于两个具有相似结构的数据库,但是由于表中的自定义字段,两者的表结构不同。所以我的理解是我可以根据运行时的要求使用两个类。顺便说一句,为什么我们在上下文中声明 DBSet 时甚至需要“Set”?
  • 本例中的Table属性只是设置要使用的表名,上下文还需要有DbSet&lt;Class1&gt;等,注册。根据您之前的评论,您确定拥有两个单独的上下文,每个数据库一个上下文不是更好吗?并使用在运行时相关的任何上下文,而不是可以与任一数据库一起使用的上下文。

标签: c# .net entity-framework


【解决方案1】:

要使用DbContext.Set&lt;T&gt;() 方法,您的上下文需要有一个匹配的DbSet&lt;T&gt; 属性。如果您有一个设置其中一个表发生更改,那么您有几个选择。

  1. DbSet&lt;Class1&gt;DbSet&lt;Class2&gt; 属性添加到您的DbContext

    public DbSet<Class1> Class1s { get; set; }
    public DbSet<Class2> Class2s { get; set; }
    

    我个人喜欢这样做。

  2. 具有通用上下文并使更改的表继承自公共基础。例如:

    public class BaseClass
    {
        //shared properties go in here
    }
    
    public class Class1 : BaseClass
    {
        //custom properties here
    }
    
    public class Class2 : BaseClass
    {
        //custom properties here
    }
    

    您的上下文可能如下所示:

    public class MyContext<T> : DbContext
        where T : BaseClass
    {
        public DbSet<T> Class1s { get; set; }
    }
    

【讨论】:

  • 谢谢,第二个更有意义。有没有其他方法可以动态定义 DbSet 的模型?
  • 我想您可以考虑在模型构建器中手动添加配置,但这对我来说听起来很可怕而且充满了问题。
  • 第二种方法给我错误“无效的列名'鉴别器'。”也无法使用接口来定义数据库集
  • 那你做错了什么。由于我不知道您的代码,因此无法提供更多帮助。
  • 从我的搜索中,我不认为您可以只派生类并使用。你试过这个工作吗?
猜你喜欢
  • 2011-06-26
  • 1970-01-01
  • 1970-01-01
  • 2012-12-06
  • 1970-01-01
  • 2013-11-10
  • 2014-11-30
  • 2017-06-19
  • 2014-01-08
相关资源
最近更新 更多