插入记录时出现问题。 NHibernate的

时间:2011-04-16 11:10:23

标签: nhibernate c#-4.0 fluent-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
}

在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();
}

}

你知道吗?

2 个答案:

答案 0 :(得分:0)

每当您创建会话和自动映射时,我都会确保您正在加载覆盖。您也应该发布该代码。这是我正在谈论的关键路线:

AutoPersistenceModel.UseOverridesFromAssemblyOf<PestMap>()

修改
有关此内容的更多信息,请参见here。特别是在“覆盖”部分。

<强> EDIT2:
还要确保它是您正在查看的正确实体。它是否抱怨害虫或损害中的身份?您可能希望发布实际的错误消息。

如果这个答案可以帮助你将其标记为答案。

答案 1 :(得分:0)

您可能不希望.GeneratedBy.Foreign(),这意味着ID由1:1关系的另一方生成。如果您只是自己分配ID,则应使用.GeneratedBy.Assigned()