3
My Entity Class:
public class Building 
    {
        /// <summary>
        /// internal Id 
        /// </summary>
        public virtual long Id { get; set; }
..............
}

My Mapping:

var model = AutoMap.AssemblyOf<Building>()
                        .Setup(s => s.FindIdentity = p => p.Name == "Id")
                        .Where(t => t.Namespace == "SpikeAutoMappings");

var database = Fluently.Configure()
                        .Database(DatabaseConfigurer)
                        .Mappings(m=>m.AutoMappings.Add(model));

I need somebody to help me see what is wrong because I keep having this error when run unit test:

Initialization method TestProject1.MappingTestBase.TestInitialize threw exception. FluentNHibernate.Cfg.FluentConfigurationException:  FluentNHibernate.Cfg.FluentConfigurationException: An invalid or incomplete configuration was used while creating a SessionFactory. Check PotentialReasons collection, and InnerException for more detail.

 --->  FluentNHibernate.Visitors.ValidationException: The entity doesn't have an Id mapped. Use the Id method to map your identity property. For example: Id(x => x.Id)..
4

3 回答 3

9

以上两个答案都是正确的;除非您指定不同,否则自动映射器假定您有一个 int Id 字段。
如果您的 ID 很长,自动映射器可能无法正确识别它。
尝试为您的类定义一个 MappingOverride,如下所示:

public class UserMappingOverride : IAutoMappingOverride<User>
{
    #region IAutoMappingOverride<User> Members

    public void Override(AutoMapping<User> mapping)
    {
        mapping.Id(u => u.Name);
    }

    #endregion
}

Id() 函数允许您覆盖自动映射器对 ID 字段应该是什么的约定。
有关覆盖的更多信息,请参阅http://wiki.fluentnhibernate.org/Auto_mapping#Overrides
干杯,
强尼

于 2011-02-21T14:45:34.267 回答
1

通常,使用AutoMapping是一个糟糕的策略,因为该字段Id必须存在于您的数据库表中。相反,请考虑使用流畅的映射生成器,例如NMG来处理您的映射。

在这种情况下,您首先要下载/安装应用程序,然后从您的数据库(Oracle、SQL 和其他各种)生成映射文件。

为了创建映射文件,首先/Entities/在您的项目中创建一个文件夹。接下来,配置生成器软件如下:

喜好

  1. 生成的属性名称 = 与数据库列名称相同(无更改)
  2. 映射样式 = Fluent 映射
  3. 字段或属性 = 自动属性

可用语言:C# 和 VB

  1. 文件夹 :[your project folder]\Entities
  2. 命名空间:[your project namespace].Entities
  3. 装配名称:[your project name].Entities

接下来,要么全部生成要么生成特定表。

现在应该在您的项目中创建所有*.cs和文件(如果它们不显示,您可以添加它们)。*Map.csAdd Existing Item...

使用 Fluent,您将看到类似以下内容:

Id(x => x.keyName_ID)
  .Column(x => x.keyname_ID)
  .GeneratedBy
  .Sequence("keyname_ID")

或者

Id(x => x.keyName_ID)
  .Column(x => x.keyname_ID)
  .GeneratedBy
  .Identity()
  .Column("keyname_ID")

或者

Id(x => x.keyName_ID)
  .Column(x => x.keyname_ID)
  .GeneratedBy
  .Assigned()

所以,现在我们需要指定Id使用FluentMappingwith Fluent nHibernate。为此,您需要覆盖解决方案中每个文件中Id的 on 代码行。Map只需添加:

Id(x => x.KeyName_ID)
  .GeneratedBy
  .GetGeneratorMapping()
  .IsSpecified("KeyName_ID");

keyname_id数据库中的列名在哪里id,而不是创建的列名。

请注意,在您的映射中,BuildSession您必须具有:

(...).Mappings(m => 
    m.FluentMappings.AddFromAssemblyOf<[one of your entities]>()
);

而且,现在Id被映射了。:) 我希望这有帮助!

于 2011-02-01T12:17:58.873 回答
0

我对 Automapping 的经验是,只要您的 Entity 类有以下行:

    public virtual int Id { get; private set; }

自动映射器会将其视为 ID,无需程序员的进一步帮助(即不需要您在 AutoMap 调用中使用的 FindIdenity 代码)。

我在您的 ID 声明中看到的唯一区别是您使用的是 long 类型而不是 int。不知道这是否重要。

于 2010-03-30T22:04:09.500 回答