无法创建FluentHibernate的实例.自动映射.自动映射命名空间.类[T],因为类型.ContainsGener

本文关键字:映射 因为 ContainsGener 类型 实例 创建 命名空间 FluentHibernate | 更新日期: 2023-09-27 18:00:04

这是我获取的错误

CookBook.Tests.CategoryRepository_Fixture.Can_update_category:
FluentNHibernate.Cfg.FluentConfigurationException : An invalid or incomplete configuration was used while creating a SessionFactory. Check PotentialReasons collection, and InnerException for more detail.

  ----> FluentNHibernate.Cfg.FluentConfigurationException : An invalid or incomplete configuration was used while creating a SessionFactory. Check PotentialReasons collection, and InnerException for more detail.

  ----> System.ArgumentException : Cannot create an instance of FluentNHibernate.Automapping.AutoMapping`1[CookBook.Repository.Repository`1[T]] because Type.ContainsGenericParameters is true.

这是我的分类对象

public class Category
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
}

这是我的测试班

[TestFixture]
class CategoryRepository_Fixture
{
    private ISessionFactory _sessionFactory;
    private RecipeConfiguration _configuration;
    private readonly Category[] _categories = new[]
    {
        new Category{Name="Dinner"},
        new Category{Name="Breakfast"},
        new Category{Name="Lunch"},
        new Category{Name="Breakfast"}
    };
    private void CreateInitialData()
    {
        using (ISession session = _sessionFactory.OpenSession())
        using (ITransaction transaction = session.BeginTransaction())
        {
            foreach (var category in _categories)
            { session.Save(category); }
            transaction.Commit();
        }
    }
    [TestFixtureSetUp]
    public void TestFixtureSetUp()
    {
        _configuration = new RecipeConfiguration();
        _sessionFactory = Fluently.Configure()
            .Database(MsSqlCeConfiguration.Standard.ShowSql().ConnectionString("Data Source=CookBook.sdf"))
            .Mappings(m => m.AutoMappings.Add(AutoMap.AssemblyOf<Category>(_configuration)))
            .ExposeConfiguration(config => new SchemaExport(config).Execute(false, true, false))
            .BuildSessionFactory();
    }
    [SetUp]
    public void SetupContext()
    {
        CreateInitialData();
    }
    [Test]
    public void Can_add_new_category()
    {
        Category cat = new Category { Name = "Dessert" };
        IRepository<Category> repository = new Repository<Category>();
        repository.Add(cat);
        using (ISession session = _sessionFactory.OpenSession())
        {
            var fromDb = session.Get<Category>(cat.Id);
            Assert.IsNotNull(fromDb);
            Assert.AreNotSame(cat, fromDb);
            Assert.AreEqual(cat.Name, fromDb.Name);
        }
    }

这是存储库类

public class Repository<T> : IRepository<T>
{
    #region IRepository Members
    public void Add(T obj)
    {
        using(ISession session = NHibernateHelper.OpenSession())
        using (ITransaction transaction = session.BeginTransaction())
        {
            session.Save(obj);
            transaction.Commit();
        }
    }
}

我做错了什么?不可能使用通用存储库吗?因为我有大约4个对象都使用相同的存储库。

无法创建FluentHibernate的实例.自动映射.自动映射命名空间.类[T],因为类型.ContainsGener

问题是,自动映射试图自动映射存储库,它不应该映射,只映射实体。RecipeConfiguration应该告诉FNH要映射哪些类。

public bool ShouldMap(Type type)
{
    return type.In(typeof(Category), typeof(Foo));
}

public bool ShouldMap(Type type)
{
    return type.Namespace == "MyNamespace.Mappings"
}

AutoMap.AssemblyOf<Category>(t => t.Namespace == "MyNamespace.Mappings"))