Невозможно создать экземпляр FluentNHibernate.Automapping.AutoMapping Namespace.Class [T], так как Type.ContainsGenericParameters имеет значение true - PullRequest
4 голосов
/ 21 июня 2011

Вот ошибка, которую я получаю

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 объектов, которые все используют один и тот же репозиторий.

1 Ответ

5 голосов
/ 23 июня 2011

проблема в том, что autopping пытается автоматизировать ваш репозиторий, чтобы он не отображал только сущности.ваш 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"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...