2010-03-29 85 views
3
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).. 

回答

0

我的Automapping使用體驗是,只要您的實體級別具有以下行:

public virtual int Id { get; private set; } 

automapper會將它視爲一個ID,而不需要程序員的進一步幫助。不需要您在AutoMap調用中使用的FindIdenity代碼)。

我在你的ID聲明中看到的唯一區別是你使用long而不是int類型。不知道這是否重要。

+1

Thx湯姆。我使用Oracle 10g和Id是長類型。 試過你的線,拿出設置FindIdentity ...仍然有同樣的錯誤.... – Gini 2010-03-31 13:49:10

1

一般情況下,使用AutoMapping是一項糟糕的政策,因爲您的數據庫表中必須存在Id。相反,請考慮使用流暢的映射生成器,例如NMG來處理您的映射。

在這種情況下,您首先需要下載/安裝應用程序,然後從您的數據庫(Oracle,SQL和其他)中生成映射文件。

爲了創建映射文件,首先在您的項目中創建一個/Entities/文件夾。接下來,如下配置信號發生器軟件:

  1. 生成的屬性名稱=同數據庫中列名(無變化)
  2. 的映射風格=流利的映射
  3. 字段或屬性=自動屬性

種語言:C#和VB

  1. 文件夾:[your project folder]\Entities
  2. 命名空間:[your project namespace].Entities
  3. 大會名稱:[your project name].Entities

接下來,無論是全部產生或生成的特定表。

所有*.cs*Map.cs文件,現在應該在您的項目(可以用Add Existing Item...添加他們,如果他們不顯示)創建的。

使用流利,你會看到類似以下內容:

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

所以,現在我們需要指定使用FluentMappingIdFluent nHibernate。爲此,您需要覆蓋解決方案中各個Map文件中的Id行代碼。只需添加:

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

哪裏keyname_idid的列名在數據庫中,而不是創建一個。在你在BuildSession映射您必須

注意:

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

而且,現在Id映射。 :) 我希望這有幫助!

9

這兩個答案都是正確的;除非你指定不同,automapper假定你有一個int Id字段。
如果您的ID很長,automapper可能無法正確識別它。
嘗試定義MappingOverride爲類(ES),像這樣:

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

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

    #endregion 
} 

的Id()函數允許您覆蓋的ID字段應該是什麼automapper的約定。
有關覆蓋的更多信息,請參見http://wiki.fluentnhibernate.org/Auto_mapping#Overrides
乾杯,
Jhonny