1

EF データベース ファーストのアプローチと MVC 4.5/Web API を使用して Web アプリを構築するための最も単純でベ​​スト プラクティスのアプローチを探しています。私のアプリケーションは、angular フレームワークを使用して ajax 呼び出しを行い、json データをオンデマンドで取得します。

現在、API 呼び出しに応答して過剰で構造化されていないデータを取得しており、それをクリーンアップする方法を知りたいです。

アプリケーションはジョブ追跡を提供するので、次のようなテーブルがあります。

Person
    Id
    Name
    Email
    Department : FK -> Department

Department
    Id
    Name

Jobs
    Id
    RequestedBy : FK -> Person
    AssignedTo  : FK -> Person

JobHistory
    Id
    JobId : FK -> Jobs

だから、理想的には私が電話するとき

$http.get(/api/People)

私は得るだろう:

[{Name: 'alice', Email: 'alice@here.com', Department: 'ABC'},
 {Name: 'bob',   Email: 'bob@here.com',   Department: 'CDE'}]

これは、通常、プリンシパル エンティティが熱心に読み込まれるが、Person に依存する他のすべてのテーブルが読み込まれるわけではないことを意味すると思います。しかし、これらの後方参照を使用して、個人が取り組んでいる、または要求したすべてのジョブを取得したい場合があります。

できれば、T4 テンプレートの変更などに頼る必要はありません。それは賢明ですが、あまり柔軟ではありません。また、電動工具を渡されるのが嫌で、使う前に回路図を調べて内部を再配線しなければならないと言いました。私はプロの開発者ではなく、ツールではなく仕事に集中したいと思っています。Linq2Sql はその点で非常に優れていました。もちろん、内臓を改造するのが正解なら、そうします。

これは、Web API の非常に簡単な使い方のように思えますが、明らかな何かが欠けていると確信しています。

ありがとう


私の問題の一部を引き起こしている可能性が最も高い追加情報を編集します。ある時点で、上記を機能させるために、次を Global.asax.cs に追加しました。

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.All;

積極的な読み込みでは、Person を参照する Jobs の 2 つのフィールドが循環参照になります。上記のコードにより、Json.Net はそれをシリアル化できますが、json に不要なデータが入ります。解決策は何らかの形で遅延読み込みに切り替えることだと思いますが、これはデータベースの最初のアプローチで行うことができますか?

4

1 に答える 1

1

奇妙なことに、まずデータベースで遅延読み込みを機能させるには、ConceptualEntityModel のプロパティで "Lazy Loading Enabled" を false に設定する必要がありました。

次に追加しました

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;

Application_Start() で、質問で前述したように PreserveReferencesHandling を削除しました。これにより、モデルから必要なきれいな json が得られました。

1 つの問題がまだ残っていますが、より良い応答がない限り、回避します。私の PersonRepository では、次を使用します。

public IEnumerable<Person> GetAll() {
return db.People
    .Include("C_Departments")
    .AsNoTracking();
}  

人々を彼らの部門と一緒に連れて行くため。残念ながら、Departments エンティティに人を指すナビゲーション プロパティがある場合、部門情報と共に部門のすべてのメンバーを熱心に読み込みます。つまり、.Include で、遅延読み込みが再び停止します。

于 2013-07-11T15:29:06.273 に答える