.NET クライアント アプリを使用して、asp .net Web API JSON を介してオブジェクト B のコレクションを含むオブジェクト A を投稿し、LocalDB データベースを作成してデータを保存しようとしています。次に、オブジェクト A を再度取得します。
アプリには 3 つのプロジェクトが含まれています。asp .net mvc 4 Web API プロジェクト、.Net コンソール アプリ、および .Net クラス ライブラリ。asp .net アプリとコンソール アプリの両方が、オブジェクト A と B のクラス定義を含むクラス ライブラリを参照します。
クラス ライブラリ:
public class Actor
{
public Actor()
{
this.Movies = new HashSet<Movie>();
}
public int ActorID { get; set; }
public string Name { get; set; }
public virtual ICollection<Movie> Movies { get; set; }
}
public class Movie
{
public Movie()
{
this.Actors = new HashSet<Actor>();
}
public int MovieID { get; set; }
public string Name { get; set; }
public virtual ICollection<Actor> Actors { get; set; }
}
コンソール アプリ:
Movie movie = new Movie()
{
Name = "Dr. No"
};
Actor actor = new Actor()
{
Name = "Sean Connery"
};
movie.Actors.Add(actor);
using (HttpClient client = new HttpClient())
{
client.BaseAddress = new Uri("http://localhost:3654");
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var response = client.PostAsJsonAsync<Movie>("api/movies", movie).Result;
response.EnsureSuccessStatusCode();
response = client.GetAsync("api/movies/1").Result;
response.EnsureSuccessStatusCode();
Movie newMovie = response.Content.ReadAsAsync<Movie>().Result;
}
asp .net mvc DbContext:
public class MediaContext : DbContext
{
public MediaContext()
{
this.Configuration.LazyLoadingEnabled = false;
}
public DbSet<Movie> Movies { get; set; }
public DbSet<Actor> Actors { get; set; }
}
問題 #1: JSON は循環参照を好まないようですが、コレクションを両方のオブジェクトに追加しないと、EF5 は参照を保持するための MoviesActors テーブルを作成しません。
問題 #2:コントローラーに参照を追加しても、そのオブジェクトを返すときに、アクタと一緒に返されません。たとえば、次のようなものを期待していました
Movie
{
MovieID = "1",
Name = "???",
Actors[] = { 1 }
}
しかし代わりに、Actors は単に null です。
更新:自己参照例外は次のとおりです。
ExceptionMessage = タイプ 'System.Data.Entity.DynamicProxies.Movie_157D88BDC89E46A7CE4875C2970C7BBFB893972095EFA0745C2261AACC007969' で自己参照ループが検出されました。パス '[0].Actors[0].Movies'.
Json シリアル化循環参照エラーをどのように解決しましたか?の方法を使用して、この例外を回避することができました。プロキシを無効にするだけです。これで問題 1 は解決します。ただし、ムービーを取得すると、Include("Actors") を使用しても、アクターなしで返されます。LocalDb の中間テーブルに参照が正しく作成されていることがわかります。
更新 2
最終的にこれを理解しました。以下に答えてください。
本当にありがとう!