【问题标题】:Entity Framework Code First and Multiple Assemblies实体框架代码优先和多个程序集
【发布时间】:2011-03-21 14:02:47
【问题描述】:

我在与其基类不同的程序集中有一个子类。父级是用于 EF Code First 的 POCO 类。

当我尝试将继承类的实例添加到数据库时,我得到 InvalidOperationException: "找不到标识为 'Foo 的类型的对象映射.Bar.MyInheritedClass'"。

如果子类和基类在同一个程序集中,它就可以正常工作。

在常规 EF 中,solution seems to be 调用 ObjectContext.MetadataWorkspace.LoadFromAssembly(assembly)。但我无法弄清楚这与 Code First 有何关系。

有什么建议吗?

我正在使用 Entity Framework 4.1 RC。

【问题讨论】:

  • 为什么还不能调用那个函数呢?我还没有实际检查过,但是根据一些快速搜索,您应该能够使用dbContext.MetadatWorkspace 从您的DbContext 访问MetadataWorkspace。那不行吗?
  • 是的,您可以将 DbContext 转换为 IObjectContextAdapter 并检索它的底层 ObjectContext(请参阅:weblogs.asp.net/jgalloway/archive/2011/01/21/…)。
  • 这让我可以尝试 MetadataWorkspace.LoadFromAssembly() 但它没有解决我的问题:(

标签: entity-framework code-first


【解决方案1】:

我通过从第一个程序集的 DbContext 继承,为派生类添加 DbSet,然后向其中添加派生类型的新实例来解决这个问题。

在MSDN论坛here.发布代码

【讨论】:

    【解决方案2】:

    我知道这篇文章有点老了,但我能够在构造函数中使用@Dave 的推荐来完成这个:

    public Context() {
        ((IObjectContextAdapter)this).ObjectContext.MetadataWorkspace.LoadFromAssembly(
            System.Reflection.Assembly.GetAssembly(
                 typeof(--[Inherited DbContext]--)));
    }
    

    【讨论】:

      【解决方案3】:

      我对 EF(实体框架 4)还很陌生,在对模型进行更改时遇到了同样的异常。

      我的问题原来是我不知道 EF 需要所有导航属性上的所有名称都同意,而不仅仅是它们的类型。例如,如果有一个名为 foo 的导航属性,则需要在相应的类中声明一个同名的变量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-30
        • 1970-01-01
        • 2012-09-23
        • 1970-01-01
        • 2013-07-04
        • 1970-01-01
        相关资源
        最近更新 更多