Entity framework 实体框架核心:在WebAPI中包含多对多相关对象
我对.NET框架不太熟悉,但决定试用ASP.NET核心和EF核心。我想制作一个非常简单的Web API后端,但我在处理多对多关系时遇到了问题 我知道我需要为这两个实体创建一个关系表,如本文中的示例所示: 我还让我的模型生成器按照这里的描述创建关系 我的代码如下所示: 在DBContext中:Entity framework 实体框架核心:在WebAPI中包含多对多相关对象,entity-framework,linq,asp.net-core,entity-framework-core,asp.net-core-webapi,Entity Framework,Linq,Asp.net Core,Entity Framework Core,Asp.net Core Webapi,我对.NET框架不太熟悉,但决定试用ASP.NET核心和EF核心。我想制作一个非常简单的Web API后端,但我在处理多对多关系时遇到了问题 我知道我需要为这两个实体创建一个关系表,如本文中的示例所示: 我还让我的模型生成器按照这里的描述创建关系 我的代码如下所示: 在DBContext中: protected override void OnModelCreating(ModelBuilder builder) { base.OnModelCreating(builde
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.Entity<MovieActor>().HasKey(x => new { x.MovieId, x.ActorId});
builder.Entity<MovieActor>()
.HasOne(m => m.Movie)
.WithMany(ma => ma.MovieActors)
.HasForeignKey(m => m.MovieId);
builder.Entity<MovieActor>()
.HasOne(m => m.Actor)
.WithMany(ma => ma.MovieActors)
.HasForeignKey(a => a.ActorId);
}
public DbSet<Movie> Movies { get; set; }
public DbSet<Actor> Actors { get; set; }
}
您必须按如下所示进行更改 型号:
namespace Test.Models
{
public class Movie
{
public int MovieId { get; set; }
public string Title { get; set; }
public DateTime ReleaseDate { get; set; }
public string Code { get; set; }
public string Path { get; set; }
public ICollection<MovieActor> MovieActors { get; set; }
}
public class Actor
{
public int ActorId { get; set; }
public string Name { get; set; }
public ICollection<MovieActor> MovieActors { get; set; }
}
public class MovieActor
{
public int MovieId { get; set; }
public Movie Movie { get; set; }
public int ActorId { get; set; }
public Actor Actor { get; set; }
}
}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.Entity<MovieActor>().HasKey(x => new { x.MovieId, x.ActorId});
builder.Entity<MovieActor>()
.HasOne(m => m.Movie)
.WithMany(ma => ma.MovieActors)
.HasForeignKey(m => m.MovieId);
builder.Entity<MovieActor>()
.HasOne(m => m.Actor)
.WithMany(ma => ma.MovieActors)
.HasForeignKey(a => a.ActorId);
}
public DbSet<Movie> Movies { get; set; }
public DbSet<Actor> Actors { get; set; }
public DbSet<MovieActor> MovieActors { get; set; }
}
var actor = new Actor { ... };
context.Actors.Add(actor);
var movie = new Movie { ... };
context.Movies.Add(movie);
var movieActor = new MovieActor { Actor = actor , Movie = movie };
context.MovieActors.Add(movieActor);
context.SaveChanges();
如何添加记录:
namespace Test.Models
{
public class Movie
{
public int MovieId { get; set; }
public string Title { get; set; }
public DateTime ReleaseDate { get; set; }
public string Code { get; set; }
public string Path { get; set; }
public ICollection<MovieActor> MovieActors { get; set; }
}
public class Actor
{
public int ActorId { get; set; }
public string Name { get; set; }
public ICollection<MovieActor> MovieActors { get; set; }
}
public class MovieActor
{
public int MovieId { get; set; }
public Movie Movie { get; set; }
public int ActorId { get; set; }
public Actor Actor { get; set; }
}
}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.Entity<MovieActor>().HasKey(x => new { x.MovieId, x.ActorId});
builder.Entity<MovieActor>()
.HasOne(m => m.Movie)
.WithMany(ma => ma.MovieActors)
.HasForeignKey(m => m.MovieId);
builder.Entity<MovieActor>()
.HasOne(m => m.Actor)
.WithMany(ma => ma.MovieActors)
.HasForeignKey(a => a.ActorId);
}
public DbSet<Movie> Movies { get; set; }
public DbSet<Actor> Actors { get; set; }
public DbSet<MovieActor> MovieActors { get; set; }
}
var actor = new Actor { ... };
context.Actors.Add(actor);
var movie = new Movie { ... };
context.Movies.Add(movie);
var movieActor = new MovieActor { Actor = actor , Movie = movie };
context.MovieActors.Add(movieActor);
context.SaveChanges();
我已经做了这些更改,但现在我的控制器不高兴了。我无法再创建新的MovieActor实体并将其添加到上下文中,它表示,
“DbContext”不包含“MovieActor”的定义。
。我如何在这里添加关系?我现在创建了一部新电影,然后创建了一个新演员,然后用这些对象创建了一个电影演员实体。当然,我刚刚从控制器中添加了一个示例方法。尝试找到演员并将其添加到相应电影中的演员列表中。似乎您尚未实现我提到的更改。这样我们无法找到解决方案。因为如果您看到EF core
文档,它们也显示了与我的帖子相同的方式。如果您无法根据这一点进行更改,希望您没有解决此问题的方法。例如:\u context.Movie.FirstOrDefault(m=>m.code==Moviebundle.Movie.code)
。这必须是这样的\u context.Movies.FirstOrDefault(m=>m.code==Moviebundle.Movie.code)
。还有很多其他人。。。