开发者

Cannot create an instance of FluentNHibernate.Automapping.AutoMapping Namespace.Class[T] because Type.ContainsGenericParameters is true

开发者 https://www.devze.com 2023-03-14 18:20 出处:网络
Here is the error i\'m getting CookBook.Tests.CategoryRepository_Fixture.Can_update_category: FluentNHibernate.Cfg.FluentConfigurationException : An invalid or incomplete configuration was used whil

Here is the error i'm getting

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.

here is my Category object

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

here is my test class

[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);
        }
    }

Here is the repository class

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

What am i doing wrong? is it not possible to use a generic repository? because I have about 4 objects that all use the same repository.


the problem is, that automapping tries to automap your repository, that it shouldn't map, only entities. your RecipeConfiguration should tell FNH which classes to map.

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

or

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

or

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

精彩评论

暂无评论...
验证码 换一张
取 消