加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

如何使用asp .net web api,实体框架和json(代码优先)来关联对象

发布时间:2020-12-16 07:23:56 所属栏目:asp.Net 来源:网络整理
导读:使用.NET客户端应用程序,我试图通过asp .net web api JSON发布一个包含对象B集合的对象A,创建一个LocalDB数据库并存储数据.然后再次获取对象A. 该应用程序包括3个项目.一个asp .net mvc 4 web api项目,一个.Net控制台应用程序和一个.Net类库. asp .net应用程
使用.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引用以创建中间表.
>将[JsonIgnore]添加到Movies集合引用以解决循环引用.
>关闭代理以解决我的500错误.
>使用.Include(“Actors”)在GetMovies / GetMovie方法中加载Actors

另外我找到了Movie对象的后续PUT,其中Actors集合已经改变,我不得不手动将每个子Actor上的RelationShip状态更改为Added / Deleted以确保相关集合已更新.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读