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"))
精彩评论