当在基于 Orchard CMS 的 Web 应用程序中添加新的 table/entity 时,如何强制刷新 NHibernate 的持久性 collection/mappings.bin?
How to forcefully refresh persister collection/mappings.bin of NHibernate when a new table/entity is added in a Orchard CMS based web app?
我通过 Migrations.cs 文件创建了一个新的 table:
// New table - StaffAddress
SchemaBuilder.CreateTable("StaffAddress",
tb => tb
.Column<int>("StaffAddressId", p => p.PrimaryKey().Identity())
.Column<bool>("UseForFutureItems", p => p.NotNull())
.Column<int>("AddressId", p => p.Nullable())
.Column<int>("StaffId", p => p.Nullable())
);
// foreign key relations
SchemaBuilder.CreateForeignKey("Fk_StaffAddress_Address", "StaffAddress",
new string[] { "AddressId" }, "Address", new string[] { "AddressId" });
SchemaBuilder.CreateForeignKey("Fk_StaffAddress_Staff", "StaffAddress",
new string[] { "StaffId" }, "Staff", new string[] { "OrchardUserID" });
我在 PersistenceConfigurations.cs 中添加了相同的映射,如下所示:
config.Mappings(x => x.AutoMappings.Add(AutoMap.Source(CreateTypeSource<entity.StaffAddress>())
.Override<entity.StaffAddress>(map =>
{
map.Table("StaffAddress");
map.Id(m => m.StaffAddressId, "StaffAddressId");
map.References(y => y.Staff, "StaffId");
map.References(z => z.Address, "AddressId");
})));
然后我创建了实体并编写了代码来保存一个 StaffAddress,当我尝试保存一个时,它给出了以下错误:
2018-08-09 13:13:09,475 [22] Service - Default - Error on creating staff address .
NHibernate.MappingException: No persister for: Models.StaffSavedAddress
at NHibernate.Impl.SessionFactoryImpl.GetEntityPersister(String entityName)
at NHibernate.Impl.SessionImpl.GetEntityPersister(String entityName, Object obj)
at NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId(Object entity, String entityName, Object anything, IEventSource source, Boolean requiresImmediateIdAccess)
at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent event)
at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.EntityIsTransient(SaveOrUpdateEvent event)
at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate(SaveOrUpdateEvent event)
at NHibernate.Impl.SessionImpl.FireSave(SaveOrUpdateEvent event)
at NHibernate.Impl.SessionImpl.Save(Object obj)
迁移运行成功并创建了 table,网站已启动但无法保存地址。
我的理解是 mappings.bin 没有得到更新,或者 Orchard CMS/Nhibernate 框架中的一些持久性集合没有得到更新。
有什么方法可以解决这个问题?
注意:我无法删除 mappings.bin,因为该应用程序是自动更新的。
我猜你的映射没有得到更新,因为散列没有得到更新。
所以在 PersistenceConfigurations.cs 检查你是否更新了哈希
ComputingHash() 方法。如果不是,请更新哈希值,您的问题将得到解决。
我通过 Migrations.cs 文件创建了一个新的 table:
// New table - StaffAddress
SchemaBuilder.CreateTable("StaffAddress",
tb => tb
.Column<int>("StaffAddressId", p => p.PrimaryKey().Identity())
.Column<bool>("UseForFutureItems", p => p.NotNull())
.Column<int>("AddressId", p => p.Nullable())
.Column<int>("StaffId", p => p.Nullable())
);
// foreign key relations
SchemaBuilder.CreateForeignKey("Fk_StaffAddress_Address", "StaffAddress",
new string[] { "AddressId" }, "Address", new string[] { "AddressId" });
SchemaBuilder.CreateForeignKey("Fk_StaffAddress_Staff", "StaffAddress",
new string[] { "StaffId" }, "Staff", new string[] { "OrchardUserID" });
我在 PersistenceConfigurations.cs 中添加了相同的映射,如下所示:
config.Mappings(x => x.AutoMappings.Add(AutoMap.Source(CreateTypeSource<entity.StaffAddress>())
.Override<entity.StaffAddress>(map =>
{
map.Table("StaffAddress");
map.Id(m => m.StaffAddressId, "StaffAddressId");
map.References(y => y.Staff, "StaffId");
map.References(z => z.Address, "AddressId");
})));
然后我创建了实体并编写了代码来保存一个 StaffAddress,当我尝试保存一个时,它给出了以下错误:
2018-08-09 13:13:09,475 [22] Service - Default - Error on creating staff address .
NHibernate.MappingException: No persister for: Models.StaffSavedAddress
at NHibernate.Impl.SessionFactoryImpl.GetEntityPersister(String entityName)
at NHibernate.Impl.SessionImpl.GetEntityPersister(String entityName, Object obj)
at NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId(Object entity, String entityName, Object anything, IEventSource source, Boolean requiresImmediateIdAccess)
at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent event)
at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.EntityIsTransient(SaveOrUpdateEvent event)
at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate(SaveOrUpdateEvent event)
at NHibernate.Impl.SessionImpl.FireSave(SaveOrUpdateEvent event)
at NHibernate.Impl.SessionImpl.Save(Object obj)
迁移运行成功并创建了 table,网站已启动但无法保存地址。
我的理解是 mappings.bin 没有得到更新,或者 Orchard CMS/Nhibernate 框架中的一些持久性集合没有得到更新。
有什么方法可以解决这个问题?
注意:我无法删除 mappings.bin,因为该应用程序是自动更新的。
我猜你的映射没有得到更新,因为散列没有得到更新。 所以在 PersistenceConfigurations.cs 检查你是否更新了哈希 ComputingHash() 方法。如果不是,请更新哈希值,您的问题将得到解决。