抱歉英语不好,我很擅长解释。
我有几个实体:目录和域。 关键字段(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
}
在DB中维护实体实例
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();
}
}
你知道吗?答案 0 :(得分:0)
每当您创建会话和自动映射时,我都会确保您正在加载覆盖。您也应该发布该代码。这是我正在谈论的关键路线:
AutoPersistenceModel.UseOverridesFromAssemblyOf<PestMap>()
修改强>
有关此内容的更多信息,请参见here。特别是在“覆盖”部分。
<强> EDIT2:强>
还要确保它是您正在查看的正确实体。它是否抱怨害虫或损害中的身份?您可能希望发布实际的错误消息。
如果这个答案可以帮助你将其标记为答案。
答案 1 :(得分:0)
您可能不希望.GeneratedBy.Foreign()
,这意味着ID由1:1关系的另一方生成。如果您只是自己分配ID,则应使用.GeneratedBy.Assigned()
。