在中等信任下使用Fluent NHibernate映射继承时的SecurityException

我在使用Medium trust运行的应用程序中映射继承时遇到问题。当我从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处理继承的问题。你在运行什么版本(两者兼而有之)?要确定问题是否特定于流畅或nhibernate的配置,您可以尝试在设置会话工厂时(完全信任)运行类似的操作:
.Mappings(m =>
{
  m.FluentMappings
    .AddFromAssemblyOf<YourEntity>()
    .ExportTo(@"C:yourexportpath");

  m.AutoMappings
    .Add(/* ... */)
    .ExportTo(@"C:yourexportpath");
})
(来自http://wiki.fluentnhibernate.org/Fluent_configuration) 这将导出标准的.hbm.xml映射文件,可用于查看应用程序是否只使用nhibernate正常运行     
出现此问题的原因是您正在使用SubclassMap&lt;> 流畅的NHibernate(即使是10月份的最新代码)在子类映射操作中使用DeepClone(..)扩展方法,该操作在内部使用BinaryFormatter克隆映射表达式,但由于它尝试读/写,因此无法在Medium Trust中运行私人会员。 我还没有修复Fluent NHibernate(虽然我正在使用fork这样做)但是我刚刚发布了一篇关于如何在Medium Trust中测试代码的帖子 第三部分有一个可下载的程序集,它有一个可用于任何NUnit测试夹具的基类,它包含指向其他部分的链接:http://boxbinary.com/2011/10/how-to-run-a-unit-测试中 - 中 - 信任与-nunitpart,三一把umbraco框架测试/     

要回复问题请先登录注册