我的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).
。
是否可以将约定与映射覆盖结合使用?
答案 0 :(得分:2)
答案是 - 是的,自动化可以使用覆盖。
看看错误说的是什么。问题不在于Locate
实体,而在于LocateMappingOverride
实体,当然,该类不应被视为实体。您必须配置IAutomappingConfiguration
,以便FluentNHibernate规则将实体视为LocateMappingOverride
。并且它确实没有Id映射。
你应该:
IAutomappingConfiguration
,以便排除实施IAutoMappingOverride<>
的类IEntity
和更改IAutomappingConfiguration
规则。