簡體   English   中英

無法創建FluentNHibernate.Automapping.AutoMapping Namespace.Class [T]的實例,因為Type.ContainsGenericParameters為true

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

這是我得到的錯誤

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.

這是我的Category對象

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個對象都使用相同的存儲庫。

問題是,自動化嘗試自動化您的存儲庫,它不應該映射,只有實體。 您的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"))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM