Проблемы со вставкой записи.Nhibernate - PullRequest
0 голосов
/ 16 апреля 2011

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

У меня есть несколько сущностей: каталоги и домены. Ссылки в ключевых полях (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. Подскажите пожалуйста как решить проблему.

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

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

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

        const string mappingsHbmFolder = @"..\..\Mappings\hbm";
        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( @"crookpc\sqlexpress" )
                                                              .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();
}

}

Вы имеете в виду?

Ответы [ 2 ]

0 голосов
/ 16 апреля 2011

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

0 голосов
/ 16 апреля 2011

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

AutoPersistenceModel.UseOverridesFromAssemblyOf<PestMap>()

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...