自动映射没有Id映射

时间:2010-03-29 21:25:10

标签: fluent-nhibernate automapping

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

我的映射:

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));

我需要有人帮我看看有什么问题,因为我在运行单元测试时一直有这个错误:

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)..

3 个答案:

答案 0 :(得分:9)

以上两个答案都是正确的;除非您指定不同,否则automapper会假定您有一个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 干杯,
的Jhonny

答案 1 :(得分:1)

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

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

要创建映射文件,请首先在项目中创建一个/Entities/文件夹。接下来,按如下方式配置生成器软件:

偏好

  1. 生成的属性名称=与数据库列名称相同(无更改)
  2. 映射样式=流利映射
  3. 字段或属性=自动属性
  4. 可用语言:C#和VB

    1. 文件夹:[your project folder]\Entities
    2. 命名空间:[your project namespace].Entities
    3. 程序集名称:[your project name].Entities
    4. 接下来,“全部生成”或“生成特定表”。

      现在应该在项目中创建所有*.cs*Map.cs文件(如果它们没有显示,您可以使用Add 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 FluentMappingFluent nHibernate来指定Id。为此,您需要覆盖解决方案中每个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

      现在{{1}}被映射了。 :)我希望这有帮助!

答案 2 :(得分:0)

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

    public virtual int Id { get; private set; }

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

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