2011-06-20 111 views
3

我對我的ID有一個約定,它會自動映射名稱爲Id的屬性作爲標識符。隨着需求的充實,我需要調整領域模型,所以我自然而然地去了網上,發現我需要創建一個繼承自IAutoMappingOverride<T>的類。自動映射約定可以與映射覆蓋一起使用嗎?

我約定:

public class PrimaryKeyConvention : IIdConvention, IIdConventionAcceptance 
{ 
    public void Apply(IIdentityInstance instance) 
    { 
     instance.Column("Id"); 
     instance.GeneratedBy.SeqHiLo(instance.Name, "10"); 
    } 

    public void Accept(IAcceptanceCriteria<IIdentityInspector> criteria) 
    { 
     criteria.Expect(x => x.Generator, Is.Not.Set); 
    } 
} 

我重寫:

public class LocateMappingOverride : IAutoMappingOverride<Locate> 
{ 
    public void Override(AutoMapping<Locate> mapping) 
    { 
     mapping.Map(x => x.SendTo).Not.Nullable(); 
    } 
} 

公約並按預期方式工作,如果我刪除我的覆蓋。

我得到的例外是The entity 'LocateMappingOverride' doesn't have an Id mapped. Use the Id method to map your identity property. For example: Id(x => x.Id).

是否可以將約定與映射覆蓋一起使用?

+1

可能要考慮通過代碼映射內置的Nhibernate 3.2。 – Newbie

回答

2

答案是 - 是的,自動映射可以使用覆蓋。

看看錯誤說的是什麼。問題不在於Locate實體,而在於LocateMappingOverride實體,當然,該類不應被視爲實體。您必須配置IAutomappingConfiguration,以便FluentNHibernate的規則包含LocateMappingOverride。它確實沒有一個Id映射。

您應該:

  • 改變你IAutomappingConfiguration,所以實現IAutoMappingOverride<>類除外
  • 此舉被搜索實體
  • 或引入一個共同的標記接口,所有的範圍之外覆蓋實體需要執行,分別爲IEntityIAutomappingConfiguration規則。
+0

哇。你是絕對正確的。我完全忽略了這一點。非常感謝你。 – gcso

+0

對於同樣的問題+1我添加了一個where子句,當自動映射我的域名彙編如下: '.Where(t =>!t.GetInterfaces()。Where(i => i.IsGenericType).Any(i => i.GetGenericTypeDefinition()== typeof(IAutoMappingOverride <>))) ' – KevD

相關問題