Fluent nhibernate 自动映射不会';我没有一个Id映射

Fluent nhibernate 自动映射不会';我没有一个Id映射,fluent-nhibernate,automapping,Fluent Nhibernate,Automapping,我在自动映射方面的经验是,只要实体类具有以下行: Initialization method TestProject1.MappingTestBase.TestInitialize threw exception. FluentNHibernate.Cfg.FluentConfigurationException: FluentNHibernate.Cfg.FluentConfigurationException: An invalid or incomplete configuration

我在自动映射方面的经验是,只要实体类具有以下行:

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)..
自动映射器会将其视为一个ID,程序员不会提供进一步的帮助(即,不需要在自动映射调用中使用FindIdenity代码)


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

一般来说,使用
自动映射是一个糟糕的策略,因为您的数据库表中必须存在已存档的
ID
。相反,考虑使用FLUENT映射生成器,例如处理映射。 在这种情况下,您首先需要下载/安装应用程序,然后从数据库(Oracle、SQL和其他各种数据库)生成映射文件

为了创建映射文件,首先在项目中创建一个
/Entities/
文件夹。接下来,按如下方式配置发电机软件:

首选项

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

  • 文件夹:
    [您的项目文件夹]\Entities
  • 命名空间:
    [您的项目命名空间].实体
  • 程序集名称:
    [您的项目名称]。实体
  • 接下来,要么生成全部,要么生成特定的表

    现在应该在项目中创建所有
    *.cs
    *Map.cs
    文件(如果它们没有显示,可以使用
    添加现有项…
    添加它们)

    使用Fluent,您将看到如下内容:

        public virtual int Id { get; private set; }
    

    因此,现在我们需要使用
    FluentMapping
    fluentnhibernate
    指定
    Id
    。为此,您需要覆盖解决方案中每个
    Map
    文件中的
    Id
    行。只需添加:

    Id(x => x.keyName_ID)
      .Column(x => x.keyname_ID)
      .GeneratedBy
      .Assigned()
    
    其中
    keyname\u id
    是数据库中
    id
    的列名,而不是创建的列名

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

    Id(x => x.KeyName_ID)
      .GeneratedBy
      .GetGeneratorMapping()
      .IsSpecified("KeyName_ID");
    
    (…).Mappings(m=>
    m、 FluentMappings.AddFromAssemblyOf()的
    );
    

    现在,
    Id
    已映射。:)我希望这有帮助

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

    (...).Mappings(m => 
        m.FluentMappings.AddFromAssemblyOf<[one of your entities]>()
    );
    
    public类UserMappingOverride:IAutoMappingOverride
    {
    #区域IAutoMappingOverride成员
    公共无效替代(自动映射)
    {
    Id(u=>u.Name);
    }
    #端区
    }
    
    Id()函数允许您覆盖automapper关于Id字段应该是什么的约定。
    有关覆盖的更多信息,请参阅。
    干杯,

    约翰尼

    Thx汤姆。Am使用Oracle 10g,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(x => x.KeyName_ID)
      .GeneratedBy
      .GetGeneratorMapping()
      .IsSpecified("KeyName_ID");
    
    (...).Mappings(m => 
        m.FluentMappings.AddFromAssemblyOf<[one of your entities]>()
    );
    
    public class UserMappingOverride : IAutoMappingOverride<User>
    {
        #region IAutoMappingOverride<User> Members
    
        public void Override(AutoMapping<User> mapping)
        {
            mapping.Id(u => u.Name);
        }
    
        #endregion
    }