无法创建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个对象都使用相同的存储库。
问题是,自动映射试图自动映射存储库,它不应该映射,只映射实体。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"))