Соглашение о первичном ключе не используется

#.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") .