2011-04-08 73 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/