在中等信任下与Fluent NHibernate映射继承时发生SecurityException
本文关键字:继承 映射 SecurityException NHibernate Fluent 信任 | 更新日期: 2023-09-27 17:49:36
我在中等信任下运行的应用程序中映射继承存在问题。当我从web.config中删除中等信任限制时,它就像一个魅力。如果我注释掉子类映射,一切也会很顺利。
当我的应用程序在Medium信任中启动时,在Fluent的配置构建期间,我捕获异常,从中我可以读取System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(…)方法没有运行权限。
我能找到的每一点信息都建议预先生成惰性代理,关闭惰性加载和禁用反射优化器。我已经做了所有的准备,如果我不映射子类,我的代码就可以工作了。
下面是我的映射:
public PageMap()
{
Id(x => x.PageID);
Map(x => x.DateCreated);
Map(x => x.DateLastAccessed);
Map(x => x.Hits);
Map(x => x.PrivateSuffix);
Map(x => x.PublicSuffix);
HasMany(x => x.Components).Not.LazyLoad();
Not.LazyLoad();
}
}
public class ComponentMap: ClassMap<Component>
{
public ComponentMap()
{
Id(x => x.ComponentID);
Map(x => x.Position);
References(x => x.Page);
DiscriminateSubClassesOnColumn("ComponentType");
Not.LazyLoad();
}
}
public class HeadingComponentMap : SubclassMap<HeadingComponent>
{
public HeadingComponentMap()
{
Map(x => x.Text);
Not.LazyLoad();
}
}
和web.config
中的相关部分<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<bytecode-provider type="null"/>
<reflection-optimizer use="false" />
<session-factory name="">
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
<property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
<property name="connection.connection_string">data source=.'SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|entities.mdf;User Instance=true</property>
<property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
<property name='proxyfactory.factory_class'>NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>
<property name='current_session_context_class'>web</property>
</session-factory>
我必须手动做所有的事情吗?
我无法解决最初的问题,但是AlexCuse给出的答案使我找到了一个变通方法。
当我更改模型时,我使用
导出映射.Mappings(
m => m.FluentMappings.AddFromAssemblyOf<SessionManager>()
.ExportTo("mappings")
)
和嵌入映射作为资源后,我使用
映射.Mappings(
m => m.HbmMappings.AddFromAssemblyOf<SessionManager>()
)
嗯,看来你已经准备好了。假设你已经经历了这些,但为了以防万一,包括
听起来你可能遇到了一个问题流畅的NHibernate处理继承的方式。你运行的是(两者)哪个版本?要确定问题是否特定于fluent或nhibernate的配置,您可以在设置会话工厂(完全信任)时尝试运行以下命令:
.Mappings(m =>
{
m.FluentMappings
.AddFromAssemblyOf<YourEntity>()
.ExportTo(@"C:'your'export'path");
m.AutoMappings
.Add(/* ... */)
.ExportTo(@"C:'your'export'path");
})
(http://wiki.fluentnhibernate.org/Fluent_configuration)这将导出标准的.hbm.xml映射文件,该文件可用于查看使用 nhibernate
问题发生是因为您正在使用SubclassMap<>
Fluent NHibernate(即使在10月份的最新代码中)在子类映射操作期间使用DeepClone(..)扩展方法,该方法内部使用BinaryFormatter克隆映射表达式,但不能在Medium Trust中运行,因为它试图读写私有成员。
我还没有修复Fluent NHibernate(尽管我正在做一个分支),但我刚刚发布了一篇关于如何在Medium Trust中进行单元测试的文章
第三部分有一个可下载的程序集,其中有一个基类,可以用于任何NUnit测试夹具,它包含到其他部分的链接:http://boxbinary.com/2011/10/how-to-run-a-unit-test-in-medium-trust-with-nunitpart-three-umbraco-framework-testing/