#.net #nhibernate #fluent-nhibernate #sharp-architecture
#.net #nhibernate #свободно-nhibernate #sharp-architecture
Вопрос:
У меня возникла проблема, когда архитектура Sharp корректно отображает все, что я настроил в своих IAutoMappingOverride
классах, за исключением Formula
. Они просто игнорируются, и, таким образом, я получаю SQL invalid identifier
при попытке запросить базу данных.
// NUnit setup
public virtual void SetUp()
{
configuration = NHibernateSession.Init(
new SimpleSessionStorage(),
RepositoryTestsHelper.GetMappingAssemblies(),
new AutoPersistenceModelGenerator().Generate(),
null,
null,
null,
FluentConfigurer.TestConfigurer.Contracts);
new FluentConfigurer(configuration)
.ConfigureNHibernateValidator()
.ConfigureAuditListeners();
}
public AutoPersistenceModel Generate()
{
return AutoMap.AssemblyOf<Contrato>(new AutomappingConfiguration())
.Conventions.Setup(GetConventions())
.IgnoreBase<Entity>()
.IgnoreBase(typeof(EntityWithTypedId<>))
.UseOverridesFromAssemblyOf<EmployeeMap>();
}
// My override.
public class EmployeeMap : IAutoMappingOverride<Employee>
{
public void Override(AutoMapping<Employee> mapping)
{
// This works...
mapping.Id(x => x.Id, "ID_EMPLOYEE");
// This is ignored...
mapping.Map(x => x.Name).Formula("UPPER(LTRIM(RTRIM(FIRST_NAME || ' ' || LAST_NAME)))");
}
}
Есть идеи?
Ответ №1:
Это не проблема с архитектурой Sharp, это проблема с Fluent Nhibernate. Какую версию FNH вы используете?
Ответ №2:
Я подтвердил, что это проблема с Fluent NHibernate
(1.2.0.694). Ранее сопоставление имен столбцов отдавало бы приоритет FluentMappingOverrides , но последнее из них отдавало бы приоритет Соглашению. Я изменил свое соглашение, чтобы исключить пространства имен, содержащие сопоставления формул, и теперь все в порядке.
public class OracleUnderscoredNamingConvention : IPropertyConvention
{
public void Apply(IPropertyInstance instance)
{
// Previously worked without this condition.
if
(Utils.WorkableDomainNamespaces.Contains(instance.Property.PropertyType.Nam espace))
{
instance.Column(OracleConventionSetter.ApplyOracleNamingConventions(instanc e.Property.Name));
}
}
}