#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 в моем сообщении.