Fluent nhibernate 使用FluentNhibernate的复合迭代自动映射复合模型

Fluent nhibernate 使用FluentNhibernate的复合迭代自动映射复合模型,fluent-nhibernate,iteration,composite,automapping,Fluent Nhibernate,Iteration,Composite,Automapping,我有一个树状结构模型,并用复合模式设计它。用于使用复合迭代在整个层次结构Im中进行迭代。 我使用了本教程: 但当我想自动映射模型时,我遇到了以下问题: {实体“d_uu0”没有映射的Id。请使用 用于映射标识属性的Id方法。例如:Idx=>x.Id.} 但getEnumerator是一种方法。我不知道为什么要把它当作一个实体来处理 public IEnumerator<MenuComponent> GetEnumerator() { fore

我有一个树状结构模型,并用复合模式设计它。用于使用复合迭代在整个层次结构Im中进行迭代。 我使用了本教程:

但当我想自动映射模型时,我遇到了以下问题:

{实体“d_uu0”没有映射的Id。请使用 用于映射标识属性的Id方法。例如:Idx=>x.Id.}

但getEnumerator是一种方法。我不知道为什么要把它当作一个实体来处理

public IEnumerator<MenuComponent> GetEnumerator()
        {
             foreach (MenuComponent child in menuComponents)
                yield return this;
        }
上传示例代码:

public abstract class CombatElement
{
    public virtual string Name { get; set; }
    public virtual Guid Id { get; set; }

    public virtual void Add(
        CombatElement element)
    {
        throw new NotImplementedException();
    }

    public virtual void
        Remove(CombatElement element)
    {
        throw new NotImplementedException();
    }

    public virtual
        IEnumerable<CombatElement>
            GetElements()
    {
        throw new NotImplementedException();
    }



    public abstract void Fight();
    public abstract void Move();
}
//////

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

using System.Diagnostics;

namespace FluentNHibernateMvc3.Models

{
    public class Formation : CombatElement
    {
        private List<CombatElement> _elements;
        public virtual IEnumerable<CombatElement> Elements { get { return _elements; } }

        public Formation()
    {
        _elements = new List<CombatElement>();
    }

    public override void Add(
        CombatElement element)
    {
        _elements.Add(element);
    }

    public override void
        Remove(CombatElement element)
    {
        _elements.Remove(element);
    }

    public override void Fight()
    {
        Debug.WriteLine(this.Name + " Formation is fighting");
    }

    public override void Move()
    {
        Debug.WriteLine(this.Name + " Formation is moving");
    }

    public override
        IEnumerable<CombatElement>
            GetElements()
    {
        // yield up this current object first
        yield return this;

        // iterate through all child elements
        foreach (CombatElement fe in
            _elements)
        {
            // + iterate through each of its elements
            foreach (CombatElement feInner
                    in fe.GetElements())
                yield return feInner;
        }
    }
}
}

/////////

public class Soldier : CombatElement
{
    public virtual int Rank { get; set; }

    public override void Fight()
    {
        Debug.WriteLine(this.Name + " soldier is fighting");
    }

    public override void Move()
    {
        Debug.WriteLine(this.Name + " soldier is fighting");
    }

    public override
        IEnumerable<CombatElement>
            GetElements()
    {
        yield return this;
    }
}
这里是我如何创建会话工厂的

 // Returns our session factory
    private static ISessionFactory CreateSessionFactory()
    {
        //m => m.FluentMappings.AddFromAssemblyOf<FormationMap>()
        return Fluently.Configure()
            .Database( CreateDbConfig )
            .Mappings(m => m.AutoMappings.Add(CreateMappings()))
            .ExposeConfiguration( UpdateSchema )
            .CurrentSessionContext<WebSessionContext>()
            .BuildSessionFactory();
    }

    // Returns our database configuration
    private static MsSqlConfiguration CreateDbConfig()
    {
        return MsSqlConfiguration
            .MsSql2008
            .ConnectionString( c => c.FromConnectionStringWithKey( "testConn" ) );
    }

    // Returns our mappings
    private static AutoPersistenceModel CreateMappings()
    {
        var cfg = new AutomappingConfiguration();
        return AutoMap
            .Assemblies(cfg,System.Reflection.Assembly.GetCallingAssembly()).IncludeBase<CombatElement>()
            .Conventions.Setup( c => c.Add( DefaultCascade.SaveUpdate() ) );
    }

    // Updates the database schema if there are any changes to the model,
    // or drops and creates it if it doesn't exist
    private static void UpdateSchema( Configuration cfg )
    {
        new SchemaUpdate( cfg )
            .Execute( false, true );
    }

有人知道吗?

你能发布MenuComponent的映射吗?您可能缺少Idx=>x.Id;因此,我使用自动映射,所以我不创建映射对象。如果我对getEnumerator方法进行注释,fluentNhibernate将简单地映射模型!
 // Returns our session factory
    private static ISessionFactory CreateSessionFactory()
    {
        //m => m.FluentMappings.AddFromAssemblyOf<FormationMap>()
        return Fluently.Configure()
            .Database( CreateDbConfig )
            .Mappings(m => m.AutoMappings.Add(CreateMappings()))
            .ExposeConfiguration( UpdateSchema )
            .CurrentSessionContext<WebSessionContext>()
            .BuildSessionFactory();
    }

    // Returns our database configuration
    private static MsSqlConfiguration CreateDbConfig()
    {
        return MsSqlConfiguration
            .MsSql2008
            .ConnectionString( c => c.FromConnectionStringWithKey( "testConn" ) );
    }

    // Returns our mappings
    private static AutoPersistenceModel CreateMappings()
    {
        var cfg = new AutomappingConfiguration();
        return AutoMap
            .Assemblies(cfg,System.Reflection.Assembly.GetCallingAssembly()).IncludeBase<CombatElement>()
            .Conventions.Setup( c => c.Add( DefaultCascade.SaveUpdate() ) );
    }

    // Updates the database schema if there are any changes to the model,
    // or drops and creates it if it doesn't exist
    private static void UpdateSchema( Configuration cfg )
    {
        new SchemaUpdate( cfg )
            .Execute( false, true );
    }