Проблемы с вставкой записи. Nhibernate

#nhibernate #c#-4.0 #fluent-nhibernate

#nhibernate #c #-4.0 #свободно-nhibernate

Вопрос:

Извините за плохой английский, я плохо его интерпретирую.

У меня есть пара объектов: каталоги и домены. Ссылки в ключевых полях (Id) не должны превосходить автоматически сгенерированные, т.е. я должен написать их сам.

Вот объекты кода.

  /// <summary>
///   Вредитель. [KEN]
/// </summary>
public class Pest
{
    public virtual long Id {get; set;}
    public virtaul string Value {get; set;}
    public virtual string Remark {get; set;}   
}

public class Damage
{
    public virtual long Id {get; set;}        

    public virtual DamageType DamageType { get; set; }

    public virtual Int16 DamageYear { get; set; }

    public virtual Pest FirstPest { get; set; }

    public virtual byte FisrtDamageExtent { get; set; }

}
  

Я использовал автоматическое сопоставление FluentNHibernate.

Это перекрытие используется для руководства.

  public class PestMap : IAutoMappingOverride<Pest>
{
    #region IAutoMappingOverride<Pest> Members

    public void Override( AutoMapping<Pest> autoMapping )
    {
        autoMapping.Id( x => x.Id, "Id" ).GeneratedBy.Foreign();
    }

    #endregion
}
  

при сохранении экземпляра объекта в базе данных

 session.Save(
                     new Pest(103)
                     {
                             Id = 103,
                             Value = "value3",
                             Remarks = "Remark3"
                     } );
  

получаю сообщение об ошибке — Не удается разрешить свойство: id.
Подскажите, пожалуйста, как решить проблему.

Редактировать

для Cole W это модель генерации кода:

 public class ModelGenerator
{
    public AutoPersistenceModel Generate()
    {
        var automap = new AutoPersistenceModel();

        const string mappingsHbmFolder = @"....Mappingshbm";
        if (!Directory.Exists(mappingsHbmFolder))
        {
            Directory.CreateDirectory(mappingsHbmFolder);
        }

        automap.Conventions.AddFromAssemblyOf<ModelGenerator>();
        automap.UseOverridesFromAssemblyOf<ModelGenerator>();
        automap.AddEntityAssembly(Assembly.GetAssembly(typeof(Activity)))
            .Where(x => x.Namespace.Contains("Entities"))
            .IgnoreBase(typeof(HandbookEntity<>))
            .IgnoreBase(typeof(HandbookEntity))
            .IgnoreBase(typeof(Entity<>))
            .IgnoreBase(typeof(Entity))
            .IgnoreBase(typeof(EntityWithCoppice))
            .IgnoreBase(typeof(EntityWithNumber))
            .WriteMappingsTo(mappingsHbmFolder);
        return automap;
    }
}
  

запустите программу

 private static Configuration CreateSessionFactory()
{
    var modelGenerator = new ModelGenerator();
    return Fluently.Configure()
            .Database(
                      MsSqlConfiguration
                              .MsSql2008
                              .ConnectionString( x => x
                                                              .Server( @"crookpcsqlexpress" )
                                                              .Database( "b1" )
                                                              .TrustedConnection() )
                              .UseReflectionOptimizer() )
            .Mappings( m => m.AutoMappings.Add( modelGenerator.Generate() ) )
            .ExposeConfiguration( BuildSchema )
            .BuildConfiguration();
}

private static void BuildSchema( Configuration config )
{
    new SchemaExport( config )
            .SetOutputFile( @"db.sql" )
            .Create( false, true );
}

private static void Main( string[] args )
{
    var sessionFactory = CreateSessionFactory().BuildSessionFactory();
        using ( var tx = session.BeginTransaction() )
        {
              session.Save(
                 new Pest(103)
                 {
                         Id = 103,
                         Value = "value3",
                         Remarks = "Remark3"
                 } );
            tx.Commit();
        }


    Console.WriteLine( "Press any key..." );
    Console.ReadKey();
}
  

}

что вы имеете в виду?

Ответ №1:

Вы, вероятно, не хотите .GeneratedBy.Foreign() , что означает, что идентификатор генерируется другой стороной отношения 1: 1. Если вы просто присваиваете идентификатор самостоятельно, вам следует использовать .GeneratedBy.Assigned() .

Комментарии:

1. Если я использую. Сгенерировано. Присваивается (), тогда я не могу записать в поле ID его значение. (В базе данных она помечена как доступная ТОЛЬКО для чтения). А при сохранении объекта в базе данных идентификатор генерируется автоматически.

Ответ №2:

Я бы убедился, что вы загружаете свои переопределения всякий раз, когда создаете сеанс и автоматические сопоставления. Вероятно, вам также следует опубликовать этот код. Это ключевая строка, о которой я говорю:

 AutoPersistenceModel.UseOverridesFromAssemblyOf<PestMap>()
  

Редактировать:
Более подробную информацию об этом можно найти здесь. В частности, в разделе «Переопределения».

Правка2:
Также убедитесь, что это правильный объект, на который вы смотрите. Он жалуется на идентификатор в Pest или Damage? Возможно, вы захотите опубликовать фактическое сообщение об ошибке.

Если этот ответ поможет вам, отметьте его как ответ.

Комментарии:

1. Вы имеете в виду мою модель генерации кода, настройку и создание сеанса?

2. Взгляните на Edit2 в моем сообщении.