2011-07-27 37 views
0

我有以下模型。如何構建和映射派生自系統類的實體類與不是虛擬的屬性和方法?

public class DataValue : Collection<DataValue> 
{ 
    private List<DataValue> _values; 
    public virtual int Id { get; set; } 
    public virtual string Value { get; set; } 

    protected override void InsertItem(int index, DataValue item) 
    { 
    base.InsertItem(index, item); 
    this._values.Add(item._value); 
    } 
} 

模型繼承Collection類。這是我的領域模型所需要的,但它對NHibernate並不重要。因此,該類的每個實例都是數據庫中的一行,但它可以包含由軟件的其他部分初始化的其他DataValues。 我映射像這樣(流利)

public DataValueMap() 
{ 
    Id(x => x.Id); 
    Map(x => x.Value); 
} 

現在,當NHibernate的嘗試創建代理類,它拋出以下錯誤

NHibernate.InvalidProxyTypeException: NHibernate.InvalidProxyTypeException: 
The following types may not be used as proxies: 
DataValue: method get_Count should be 'public/protected virtual' or 'protected internal virtual' 
DataValue: method get_Item should be 'public/protected virtual' or 'protected internal virtual' 
DataValue: method set_Item should be 'public/protected virtual' or 'protected internal virtual' 
DataValue: method Add should be 'public/protected virtual' or 'protected internal virtual' 
etc... basically all the Collection methods and properties 

當然,這是由以下事實引起的收集方法和屬性不是虛擬的。我應該如何解決這個問題?

  • DataValue應該是可延遲加載的,因此禁用LazyLoad不是一個選項。
  • 我可以實現IList並且不繼承Collection,但是會混亂這個類並繼承一個Collection,在我看來,這是更清潔的。

回答

0

任何時候代理參與你有將所有公共屬性和方法標記爲虛擬。這是因爲爲了返回一個映射類的代理,nhibernate會從你的對象中繼承一個代理對象,並向它添加延遲加載魔法。因此,被延遲加載的映射類上的每個公共屬性都必須是虛擬的。既然你不能控制你直接從Collection繼承的屬性(我不確定你爲什麼這樣做的周圍代碼原因),你需要考慮重新安排你的代碼來忽略這個需求,或者嘗試繼承ICollection並直接實現這些方法,而不是直接從Collection繼承(可能是最好的方法)。

+0

我最終像David在這個答案中描述的那樣實現它。 Firo的方法在某些情況下也是可行的。我實施了IList並擁有類型Collection的私人權限。 –

0

檢查可以被禁用:

public class CustomProxyFactoryFactory : IProxyFactoryFactory 
{ 
    NHibernate.ByteCode.Castle.ProxyFactoryFactory internalfactory = ...; 

    public IProxyFactory BuildProxyFactory() 
    { 
     return internalfactory.BuildProxyFactory(); 
    } 

    public bool IsInstrumented(Type entityClass) 
    { 
     return true; 
    } 

    public bool IsProxy(object entity) 
    { 
     return (entity is INHibernateProxy); 
    }  

    public IProxyValidator ProxyValidator 
    { 
     get { return new CustomProxyValidator(); } 
    } 
} 

public class CustomProxyValidator : DynProxyTypeValidator 
{ 
    private const bool iDontCare = true; 

    protected override bool CheckMethodIsVirtual(Type type) 
    { 
     return iDontCare; 
    } 
} 

使用fluentnhibernate

Fluently.Configure() 
    .Database(xxxConfiguration.Standard 
     .ProxyFactoryFactory<CustomProxyFactoryFactory>()) 

我不知道是否能城堡處理非虛方法

相關問題