2013-06-25 66 views
0

我正在開發一個使用Breezejs,EF 4.4,MVC4,WebAPI和OData的應用程序。當breeze調用元數據ActionMethod時,結果爲空。我們使用代碼優先的方法,因此沒有EDMX文件,所以我認爲當breeze嘗試在某些容量中「重新創建」EDMX時出現錯誤,而它不能。請參閱下面的源代碼,其中try catch產生異常微風元數據在GetMetadataFromDbContext方法上返回null - EF 4.4 MVC4 WebAPI OData

執行失敗的運行時代碼示例。

// ~/odata/Analysis/Metadata 
[HttpGet] 
public string Metadata() 
{ 
    return _contextProvider.Metadata(); 
} 

我已設法包括我的項目爲位於GitHub上的Breezejs庫。代碼行「EdmxWriter.WriteEdmx(dbContext,xwriter);」。我不確定問題是什麼,但是「WriteEdmx」方法的內容也在下面。

有沒有人有任何想法是怎麼回事?我能想到的唯一的事情就是我正在使用的上下文是從基本上下文繼承而來,然後繼承自DbContext,但除此之外,我完全困惑並停滯不前。注意:我已經讀過,微風中尚不支持繼承,但我不確定是否包含上下文類,並且在單獨的測試用例中,我使用了從DbContext繼承的上下文,但仍然收到相同的錯誤。

private static String GetMetadataFromDbContext(Object context) { 
    var dbContext = (DbContext) context; 
    XElement xele; 

    try { 
    using (var swriter = new StringWriter()) { 
     using (var xwriter = new XmlTextWriter(swriter)) { 
     EdmxWriter.WriteEdmx(dbContext, xwriter); 
     xele = XElement.Parse(swriter.ToString()); 
     } 
    } 
    } catch (Exception e) { 
    if (e is NotSupportedException) { 
     // DbContext that fails on WriteEdmx is likely a DataBase first DbContext. 
     return GetMetadataFromObjectContext(dbContext); 
    } else { 
     throw; 
    } 
    } 

    var ns = xele.Name.Namespace; 
    var conceptualEle = xele.Descendants(ns + "ConceptualModels").First(); 
    var schemaEle = conceptualEle.Elements().First(ele => ele.Name.LocalName == "Schema"); 
    var xDoc = XDocument.Load(schemaEle.CreateReader()); 

    var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext; 
    // This is needed because the raw edmx has a different namespace than the CLR types that it references. 
    xDoc = UpdateCSpaceOSpaceMapping(xDoc, objectContext); 
    return XDocToJson(xDoc); 
} 

「WriteEdmx」

// Summary: 
//  Uses Code First with the given context and writes the resulting Entity Data 
//  Model to the given writer in EDMX form. This method can only be used with 
//  context instances that use Code First and create the model internally. The 
//  method cannot be used for contexts created using Database First or Model 
//  First, for contexts created using a pre-existing System.Data.Objects.ObjectContext, 
//  or for contexts created using a pre-existing System.Data.Entity.Infrastructure.DbCompiledModel. 
// 
// Parameters: 
// context: 
//  The context. 
// 
// writer: 
//  The writer. 
[SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Edmx")] 
public static void WriteEdmx(DbContext context, XmlWriter writer); 

回答

0

UPDATE:從EF 4.4降級到4.1 EF似乎已經解決了這個問題。升級到EF 5.0或夜間版本也可能會這樣做。

這是我可以做的最好的關於這個晦澀難懂的問題。 #保持原樣