【问题标题】:Using Entities from an Entity Framework (v3.5) Model with Fluent NHibernate使用 Fluent NHibernate 的实体框架 (v3.5) 模型中的实体
【发布时间】:2011-04-07 18:27:53
【问题描述】:

使用 Microsoft 的实体框架设计器 (v3.5),我创建了一个实体模型 (*.edmx),并生成了 *.Designer.cs 类。我可以使用该模型将我的对象持久保存到 MS SQL Server,而不会出现任何问题。


我是 NHibernate 的新手,出于好奇,我现在想将我的模型与 Fluent NHibernate 和 SQLite 一起用作数据库。我已经阅读了Auto mapping article on the Fluent NHibernate wiki。我确实调整了Examples.FirstAutomappedProject 并调整了ExampleAutomappingConfiguration 来映射我的实体。 (我只使用了ShouldMap 和IsId 覆盖)。我的实体相当简单,并且在模型中不包含对彼此的显式引用。
现在,当我构建会话工厂时,出现以下异常:

An invalid or incomplete configuration was used while creating a SessionFactory. Check PotentialReasons collection, and InnerException for more detail.

消息有内部异常

An association from the table XXX refers to an unmapped class: System.Data.EntityKey

我的实体的所有属性都不是System.Data.EntityKey 类型。

[global::System.Data.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName="MyStorageModel", Name="XXX")]
[global::System.Runtime.Serialization.DataContractAttribute(IsReference=true)]
[global::System.Serializable()]
public partial class XXX: global::System.Data.Objects.DataClasses.EntityObject
{
  //...
     [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
     [global::System.Runtime.Serialization.DataMemberAttribute()]
     public global::System.Guid XXXID
     {
        //...
     }
  //...
}

如您所见,我的实体类被大量装饰(当然是由使用过的设计师),其属性可能引用了这种类型。 这会导致这些麻烦吗?

【问题讨论】:

  • 您是否尝试过使用流畅的映射而不是自动映射?您应该能够选择您要映射的内容和不想映射的内容。

标签: nhibernate entity-framework fluent-nhibernate model mapping


【解决方案1】:

问题可能是您的实体是从 EntityObject 继承的。 EntityObject 声明了两个公共属性:EntityKey 和 EntityState。 EntityKey 属于 EntityKey 类型,它的处理方式类似于与您未提供给 NHibernate 的类的关联。我认为除非你使用不是从 EntityObject 继承的 EF 4.0 和 POCO,否则你将无法做到这一点。

【讨论】:

  • 谢谢。我已经能够验证与 EntityKey 的关联。到目前为止,这确实阻止了我使用这些实体。由于这些实体确实来自一个真实的项目,我现在不能仅仅因为我“对 NHibernate 的好奇”而改变它。 EF4.0 还只是 CTP。
  • 没有 EF 4.0 不在 CTP 中。 EF 4.0 是已发布的 .NET 4.0 的一部分。
  • 你说得对,我在写评论时想到了代码优先方法。
【解决方案2】:

使用数据库优先的 EntityFramework 代码生成向导将生成与 EntityFramework 紧密耦合且不易与 NHibernate 一起使用的模型类。

更糟糕的是,EntityFramework 3.5 并不真正支持将(可能)与 NHibernate 一起使用的 POCO 对象。 EF 4.0 有更好的 POCO 支持,但最终我不确定它是否能如您所愿。

如果您真的想使用 Fluent NHibernate,我会丢弃 EntityFramework 模型类并重新开始。

这里有一些关于NHibernate模型类代码生成的问题:

NHibernate Generators what is the best code generator for NHibernate?

【讨论】:

  • 感谢您的回答。很遗憾,但目前我无法更改模型,因为它来自使用的生产代码。稍后,当从存储中检索实体时,我想将它们反馈回真实的应用程序,而不是某个测试版本。
  • @Marcel:我不明白你为什么认为你需要在 NHibernate “下面”使用你的 EF 模型类。您可以将另一层 POCO 模型类放在 NH 可用的 EF 之上。或者,您可以创建第二组模型类,它们是与 NHibernate 一起使用的 EF 模型类的对等体。如果您最终想摆脱 EF 3.5,您可能需要做这样的事情。无论如何,模型类应该像系统中的所有其他软件一样敏捷,并且说它们是一成不变的,这让我质疑你工作的地方的政策。祝你好运。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-29
  • 1970-01-01
相关资源
最近更新 更多