Breezejs、EF 4.4、MVC4、WebAPI、および OData を使用してアプリケーションを開発しています。Breeze が Metadata ActionMethod を呼び出すと、結果は null になります。コードファーストのアプローチを使用しているため、EDMX ファイルがないため、ブリーズが EDMX をある程度の容量で「再作成」しようとして、それができないときにエラーが発生すると思います。try catch が例外を生成するソース コードについては、以下を参照してください。
実行が失敗するランタイム コードの例。
// ~/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);