Luk*_*uke 4 .net asp.net-mvc json entity-framework code-first
使用.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; }
}
Run Code Online (Sandbox Code Playgroud)
控制台应用:
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;
}
Run Code Online (Sandbox Code Playgroud)
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; }
}
Run Code Online (Sandbox Code Playgroud)
问题#1:似乎JSON不喜欢循环引用,但是如果我不将集合添加到两个对象,EF5不会创建一个MoviesActors表来保存引用.
问题2:即使我在控制器中添加引用,当我返回该对象时,它也不会返回Actors.我估计有类似的东西
Movie
{
MovieID = "1",
Name = "???",
Actors[] = { 1 }
}
Run Code Online (Sandbox Code Playgroud)
但相反,Actors只是空的.
更新:这是自引用异常:
ExceptionMessage =使用类型'System.Data.Entity.DynamicProxies.Movie_157D88BDC89E46A7CE4875C2970C7BBFB893972095EFA0745C2261AACC007969'检测到的自引用循环.路径'[0] .Actors [0] .Movies'.
我设法使用如何解决Json序列化循环引用错误的方法解决此异常?并且只是禁用代理.这解决了问题#1.然而,当我收到电影时,即使使用Include("演员"),他们仍然会回来没有演员.我可以看到在LocalDb的中间表中正确创建了引用.
更新2
最后想出来了,回答如下.
非常感谢!
经过多次搜索,我终于能够解决我的问题.最初我尝试将[ScriptIgnore]标签添加到Movies集中,但是我使用EF5 final将默认序列化程序更改为JSON .NET.我终于发现[ScriptIgnore]没有用,我必须像这样设置[JsonIgnore]:
public class Actor
{
public int ActorID { get; set; }
public string Name { get; set; }
[JsonIgnore]
public virtual ICollection<Movie> Movies { get; set; }
}
public class Movie
{
public int MovieID { get; set; }
public string Name { get; set; }
public virtual ICollection<Actor> Actors { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在Get方法中结合.Include("Actors")的热切加载最终解决了我的问题.
总之,我需要:
另外我找到了Movie对象的后续PUT,其中Actors集合已经改变,我不得不手动将每个子Actor上的RelationShip状态更改为Added/Deleted以确保相关集合已更新.
| 归档时间: |
|
| 查看次数: |
3050 次 |
| 最近记录: |