[ASP.NET] ODataController, WebApiConfig 類別可能需要其他變更以新增此控制器的路由

摘要:[ASP.NET] ODataController, WebApiConfig 類別可能需要其他變更以新增此控制器的路由

WebApiConfig 類別可能需要其他變更以新增此控制器的路由,請將這些陳述式合併到 WebApiConfig 類別的 Register 方法。注意 OData URL 有區分大小寫。

當使用 WEB API  加入 Controller 選用

 

加入之後 出現了這段註解

 

 

此時要到WebApiConfig 新增控制器路由

啟動Server的時候出現了錯誤

因為這個資料庫是complex types

有許多的關聯性資料

導致在呼叫Entity的時候 會有 recursive loop的情況

而且也沒有 載入 上述所說的AT09 Entity
(這邊只顯示一個,其實如果加完AT09之後還會跳出很多個Entity名稱出來,我一直嘗試到加了5個還不會正常

這時就會想到 ,難道我每一次新增就要貼一次路由嗎? (一直貼一直貼 ?

於是有了以下的方法

 

 

利用 GetClasses 取得Models 內的 Entity nameSpace 然後排除掉 DbContext

static List<Type> GetClasses(string nameSpace)
{
  Assembly asm = Assembly.GetExecutingAssembly();
 
  List<Type> namespacelist = new List<Type>();
  List<Type> classlist = new List<Type>();
 
  foreach (Type type in asm.GetTypes())
  {
    if (type.Namespace == nameSpace)
      namespacelist.Add(type);
  }
 
  foreach (Type classname in namespacelist) {
    if (classname.BaseType.Name != "DbContext")
      classlist.Add(classname);
  }
  return classlist;
}

 

將原本要使用 
builder.EntitySet<ATSLV02A>("ATSLV02A");
類似的語法用

取得 classlist後
foreach的方式取代掉

var classNameList = GetClasses("prj04.Models");
foreach (var cls in classNameList)
{
  Type thisType = builder.GetType(); // Get your current class type
  MethodInfo doSomethingInfo = thisType.GetMethod("EntitySet");
 
  MethodInfo concreteDoSomething = doSomethingInfo.MakeGenericMethod(cls);
  concreteDoSomething.Invoke(builder, new object[] { cls.Name });
}

 

之後新加入的 ODataController
就不需要擔心要要貼一堆東西到WebApiConfig上