2013-05-29 49 views
0

我想定義EntityType是ViewModel的基類,並且在Save方法中,我想將ViewModel實例上傳到EntityType並保存到DBContext。但是,代碼行_DbContext.Add((EntityType)vm);不會做鑄造。我如何解決它?C#模板不能倒下子類型

public class ReportDefinitionDetailsController : BaseDataController<ReportDefinitionDetail, int, ReportDefinitionDetailsViewModel>{} 

    public abstract class BaseDataController<EntityType, Key, ViewModel> 
     where ViewModel : EntityType, new() 
     where EntityType : AuditTrail, new() 
    { 
     public void Save(ViewModel vm) 
     { 
      _DbContext.Add((EntityType)vm); 
     } 
    } 

enter image description here

+2

當你說「不工作」,這是相當有用的因爲我們無法從我們所在的位置看到你的屏幕,並且通過未知距離讀取頭腦通常是不可靠的。你有編譯器錯誤嗎?它是否不正確保存?是否有其他問題?請[編輯]你的問題,提供更多關於什麼是「不工作」的細節。如果您向我們提供這些信息,我們會幫助您更輕鬆地得到答案。謝謝。 :-) –

+0

這沒有任何意義。 ViewModel IMPLEMENTS實體類型,所以它不是一個向下投,而是向上投。 –

+0

宇宙先生用錯字 –

回答

0

兩種可能的情況,我能想到的在這裏:

  1. _DbContext.Add()期待從審計跟蹤派生的類型的參數,但沒有具體跟蹤線索。你會得到一個編譯錯誤,如:不能從'EntityType'轉換爲'DerivedEntity'。

  2. _DbContext.Add()期待AuditTrail引用,但是然後嘗試以不起作用的方式轉換傳遞的對象。例如,它通過AuditTrailDerivedClass1並嘗試投射到AuditTrailDerivedClass2。

原則:僅僅因爲A類和B類從C類派生,並不意味着A可以鑄成B.

+0

我的不好。所有EntityType也都從AuditTrail繼承,但與當前我相信的問題無關。所以層次結構是AuditTrail < - EntityType < - ViewModel –

+0

@BryanFok,這並沒有真正改變太多(可能使情況變得更糟)。我猜這是編譯時錯誤(1)? –

+0

例外情況是:無法找到EntityType'FTAccounting.MVC.Models.ReportDefinitionDetailsViewModel'的映射和元數​​據信息。但是,無論你看到的是什麼,問題是它不會在第一個位置投出類型,我想知道爲什麼 –