自动映射约定可以使用映射覆盖吗?

时间:2011-06-20 15:35:51

标签: nhibernate fluent-nhibernate

我的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 个答案:

答案 0 :(得分:2)

答案是 - 是的,自动化可以使用覆盖。

看看错误说的是什么。问题不在于Locate实体,而在于LocateMappingOverride实体,当然,该类不应被视为实体。您必须配置IAutomappingConfiguration,以便FluentNHibernate规则将实体视为LocateMappingOverride。并且它确实没有Id映射。

你应该:

  • 更改您的IAutomappingConfiguration,以便排除实施IAutoMappingOverride<>的类
  • 将覆盖移到搜索实体的范围之外
  • 或引入所有实体需要实现的通用标记接口,即分别为IEntity和更改IAutomappingConfiguration规则。