2011-06-20 66 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

相关问题