如何使用asp .net web api,实体框架和json(代码优先)来关联对象
使用.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:即使我在控制器中添加引用,当我返回该对象时,它也不会使用Actors返回它.例如.我期待类似的东西 Movie { MovieID = "1",Name = "???",Actors[] = { 1 } } 但相反,Actors只是空的. 更新:这是自引用异常: ExceptionMessage =使用类型’System.Data.Entity.DynamicProxies.Movie_157D88BDC89E46A7CE4875C2970C7BBFB893972095EFA0745C2261AACC007969’检测到的自引用循环.路径'[0] .Actors [0] .Movies’. 我设法使用How did I solve the Json serializing circular reference error?中的方法解决此异常,并且只是禁用代理.这解决了问题#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; } } 在Get方法中结合.Include(“Actors”)的热切加载最终解决了我的问题. 总之,我需要: >在两个对象上都有虚拟ICollection引用以创建中间表. 另外我找到了Movie对象的后续PUT,其中Actors集合已经改变,我不得不手动将每个子Actor上的RelationShip状态更改为Added / Deleted以确保相关集合已更新. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – 在ASP.NET MVC Razor View中显示本地日期/时
- asp.net – 无法将参数值从字符串转换为guid
- asp.net – Web服务互操作性 – wsdl复杂类型扩展
- asp.net-mvc – 用于新的Asp.net CMS站点的Oxite或S#arp架构
- asp.net – 哪个会员提供程序实现存储在web.config中的用户
- asp.net – 最佳实践:DataBound with loop vs RowDataBoun
- asp.net-mvc – 如何在MVC4中隐藏URL的参数
- 初识ABP vNext(7):vue身份认证管理&租户管理
- asp.net-mvc – MVC使用asp.net Identity添加辅助电子邮件
- asp.net-mvc – 如何构建通用存储库