#.net #fluent-nhibernate
#.net #свободно-nhibernate
Вопрос:
У меня есть следующая свободная конфигурация NHibernate:
var fluentConfig = Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2008
.ConnectionString(c => c
.FromConnectionStringWithKey("TestPortalDbContext"))
)
.Mappings(m =>
m.FluentMappings.AddFromAssemblyOf<Program>()
.Conventions.AddFromAssemblyOf<PrimaryKeyConvention>()
.Conventions.Add<PrimaryKeyConvention>()
);
Проблема в том, что PrimaryKeyConvention
не используется. Я неправильно его настраиваю?
Обновить
Одно из моих сопоставлений (сгенерированное NHibernate Mapping Generator)
public class TestResultMap : ClassMap<TestResult> {
public TestResultMap() {
Table("TestResults");
LazyLoad();
Id(x => x.Id).GeneratedBy.Identity().Column("Id");
References(x => x.TestSession).Column("SessionId");
References(x => x.Instruction).Column("InstructionId");
References(x => x.SolvedBy).Column("SolvedBy");
Map(x => x.State).Column("StateId").CustomType<TestState>();
Map(x => x.ActualResult).Column("ActualResult");
Map(x => x.CompletedAt).Column("CompletedAt");
Map(x => x.IsSolved).Not.Nullable().Column("IsSolved");
}
}
Ошибка
Ошибка, которую я получаю, заключается в том, что ключ «ClassName_id» не найден.
Соглашение
public class PrimaryKeyConvention
: IIdConvention
{
public void Apply(IIdentityInstance instance)
{
instance.Column(instance.EntityType.Name "Id");
}
}
Он жалуется на PK при поиске связанного объекта
Комментарии:
1. Если вы используете обычные сопоставления (вручную
ClassMap<>
), используются ли соглашения вообще? Единственный раз, когда я использовал соглашения, — это когда я выполняю автоматическое сопоставление. Если они это сделают, то для меня конфигурация выглядит хорошо.2. Я добавил пример сопоставления.
3. Я подозреваю, что ваше сопоставление немного не так, мне кажется, что вы явно указываете своему идентификатору столбец с именем ‘Id’, а затем меняете конфигурацию, чтобы попытаться найти что-то под названием ‘TestResultId’.
4. соглашения также применяются к fluentmappings, но никогда не переопределяют явно установленные значения, такие как
.Column("Id")
, такжеinstance.EntityType.Name "Id"
не дает вам «ClassName_id» только «ClassNameId». Трассировка стека помогла бы
Ответ №1:
соглашения также применяются к fluentmappings, но никогда не переопределяют явно установленные значения, такие как .Column("Id")
.