2011-04-08 72 views
1

我在我的应用程序运行在中等信任下映射继承问题。当我从web.config中删除中等信任限制时,它就像一个魅力。如果我注释掉我的子类映射,一切都很顺利。Security映射继承与中等信任下的流利NHibernate

当我的应用程序以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> 

我将不得不手动尽一切?我非常想在这里使用继承。

回答

3

我无法解决原来的问题,但答案是AlexCuse给了我一个解决方法。

当我改变模型我出口使用

.Mappings(
    m => m.FluentMappings.AddFromAssemblyOf<SessionManager>() 
    .ExportTo("mappings") 
) 

映射和我的地图使用

.Mappings(
    m => m.HbmMappings.AddFromAssemblyOf<SessionManager>() 
) 
0

嗯,好像你有你的基地覆盖。假设你已经通过this,但包括以防万一。

这听起来像你可能遇到了流利的NHibernate处理继承问题。你运行的是哪个版本?要确定问题是否具体到流利或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

0

的问题发生嵌入映射为资源后,由于您使用的是SubclassMap <>

流利的NHibernate(甚至在10月份的最新代码中)在子类映射操作期间使用DeepClone(..)扩展方法,它在内部使用BinaryFormatter克隆映射表达式,但无法在Medium Trust中运行,因为它尝试读取/写入私有成员。

我没有固定的功能NHibernate(虽然我的叉子这样做的过程中),但我刚才提出了一个帖子最近刚刚就如何单元测试代码中信任

第三部分有一个可下载的组件,其基础类可以用于任何NUnit测试夹具,并且包含指向其他部分的链接:http://boxbinary.com/2011/10/how-to-run-a-unit-test-in-medium-trust-with-nunitpart-three-umbraco-framework-testing/