Создание базы данных наизнанку
У меня обычно нет проблем с "заполнением" базы данных через NHibernate, например:
...
string[] mappingAssemblies = new string[] { "Bla.Di.Domain" };
string configFile = "NHibernate.config";
NHibernate.Cfg.Configuration config = NHibernateSession.Init(
new SimpleSessionStorage(),
mappingAssemblies,
new AutoPersistenceModelGenerator().Generate(),
configFile);
TextWriter writeFile = new StreamWriter("d:/SeedSQL.sql");
var session = NHibernateSession.GetDefaultSessionFactory().OpenSession();
new SchemaExport(config).Execute(true, true, false, session.Connection, writeFile);
По какой-то причине база данных не создана для вышеуказанного dll (Bla.Di.Domain) с простым классом, подобным этому:
namespace Bla.Di.Domain
{
using SharpArch.Domain.DomainModel;
public class Test : Entity
{
public virtual string X { get; set; }
}
}
Есть что-нибудь, что могло бы пойти не так? Я не получаю исключения. Я ссылался на dll в моем проекте 'seeding'. Может быть, есть проблема с расположением файла моей DLL (это довольно сложное решение). Благодарю.
PS (согласно запросу в комментарии):
Это мой AutoPersistenceModelGenerator - обратите внимание, что он находится в другом пространстве имен:
public class AutoPersistenceModelGenerator : IAutoPersistenceModelGenerator
{
public AutoPersistenceModel Generate()
{
//var mappings = AutoMap.AssemblyOf<Bla>(new AutomappingConfiguration());
var mappings = AutoMap.AssemblyOf<Test>(new AutomappingConfiguration());
mappings.IgnoreBase<Entity>();
mappings.IgnoreBase(typeof(EntityWithTypedId<>));
mappings.Conventions.Setup(GetConventions());
mappings.UseOverridesFromAssemblyOf<AutoPersistenceModelGenerator>();
return mappings;
}
private static Action<IConventionFinder> GetConventions()
{
return c =>
{
c.Add<PrimaryKeyConvention>();
c.Add<CustomForeignKeyConvention>();
c.Add<HasManyConvention>();
c.Add<TableNameConvention>();
};
}
}
Я добавил ссылку на модель домена (другое пространство имен) и изменил:
var mappings = AutoMap.AssemblyOf<Bla>(new AutomappingConfiguration());
чтобы:
var mappings = AutoMap.AssemblyOf<Test>(new AutomappingConfiguration());
1 ответ
Допустим, у нас есть два пространства имен: CompanyName.X и CompanyName.Y.
CompanyName.X содержит класс A, а CompanyName.Y содержит B, где A и B наследуются от Entity. Тогда эта адаптация помогает:
Оригинал:
public class AutoPersistenceModelGenerator : IAutoPersistenceModelGenerator
{
public AutoPersistenceModel Generate()
{
var mappings = AutoMap.AssemblyOf<A>(new AutomappingConfiguration());
mappings.IgnoreBase<Entity>();
mappings.IgnoreBase(typeof(EntityWithTypedId<>));
mappings.Conventions.Setup(GetConventions());
mappings.UseOverridesFromAssemblyOf<AutoPersistenceModelGenerator>();
return mappings;
}
...
Адаптированный код:
public class AutoPersistenceModelGenerator : IAutoPersistenceModelGenerator
{
public AutoPersistenceModel Generate()
{
var mappings = AutoMap.AssemblyOf<A>(new AutomappingConfiguration());
mappings.AddEntityAssembly(typeof(CompanyName.Y.B).Assembly);
mappings.IgnoreBase<Entity>();
mappings.IgnoreBase(typeof(EntityWithTypedId<>));
mappings.Conventions.Setup(GetConventions());
mappings.UseOverridesFromAssemblyOf<AutoPersistenceModelGenerator>();
return mappings;
}
...