AutoMapper - 对象列表的整数列表
AutoMapper - list of ints to list of objects
电影实体
public class Movie
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string Name { get; set; }
public DateTime PublishDate { get; set; }
public Genre Genre { get; set; }
public int GenreId { get; set; }
public Director Director { get; set; }
public int DirectorId { get; set; }
public List<Actor> Actors { get; set; }
public decimal Price { get; set; }
}
CreateMovieM dto
public class CreateMovieM
{
public string Name { get; set; }
public decimal Price { get; set; }
public int DirectorId { get; set; }
public int GenreId { get; set; }
public string PublishDate { get; set; }
public List<int> ActorsIds { get; set; }
}
映射配置文件
CreateMap<int, Actor>()
.ForMember(dest => dest.Id, opt => opt.MapFrom(src => src));
CreateMap<CreateMovieM, Movie>()
.ForMember(dest => dest.Actors, opt => opt.MapFrom(src => src.ActorsIds));
创建命令
public class CreateMovieCommand
{
private readonly IMovieStoreDbContext _context;
private readonly IMapper _mapper;
private CreateMovieM _Model { get; set; }
public CreateMovieCommand(IMovieStoreDbContext context, IMapper mapper, CreateMovieM model)
{
_context = context;
_mapper = mapper;
_Model = model;
}
public void Handle()
{
var movie = _context.Movies.SingleOrDefault(x => x.Name == _Model.Name);
if (movie is not null)
throw new InvalidOperationException("Movie already exists");
movie = _mapper.Map<Movie>(_Model);
_context.Movies.Add(movie);
_context.SaveChanges();
}
}
这是数据生成器
public class DataGenerator
{
public static void Initialize(IServiceProvider services)
{
using var context = new MovieStoreDbContext(
services.GetRequiredService<DbContextOptions<MovieStoreDbContext>>());
var a1 = new Actor { Id = 1, Name = "Kemal", Surname = "Sunal" };
var a2 = new Actor { Id = 2, Name = "Peri", Surname = "Baumeister" };
var a3 = new Actor { Id = 3, Name = "Daniel", Surname = "Radcliffe" };
var m1 = new Movie { Name = "Blood Red Sky", GenreId = 1, DirectorId = 2, Price = 10, PublishDate = new DateTime(1999, 5, 19), Actors = new List<Actor> { a2 } };
var m2 = new Movie { Name = "Harry Potter", GenreId = 2, DirectorId = 3, Price = 15, PublishDate = new DateTime(1999, 5, 19), Actors = new List<Actor> { a3 } };
var m3 = new Movie { Name = "Hababam Sinifi", GenreId = 3, DirectorId = 1, Price = 20, PublishDate = new DateTime(1999, 5, 19), Actors = new List<Actor> { a1 } };
context.Movies.AddRange(
new Movie { Id = 1, Name = "Blood Red Sky", GenreId = 1, DirectorId = 2, Price = 10, PublishDate = new DateTime(1999, 5, 19), Actors = new List<Actor> { a2 } },
new Movie { Id = 2, Name = "Harry Potter", GenreId = 2, DirectorId = 3, Price = 15, PublishDate = new DateTime(1999, 5, 19), Actors = new List<Actor> { a3 } },
new Movie { Id = 3, Name = "Hababam Sinifi", GenreId = 3, DirectorId = 1, Price = 20, PublishDate = new DateTime(1999, 5, 19), Actors = new List<Actor> { a1 }, }
);
context.Genres.AddRange(
new Genre { Id = 1, Name = "Action" },
new Genre { Id = 2, Name = "Science Fiction" },
new Genre { Id = 3, Name = "Comedy" }
);
context.Directors.AddRange(
new Director { Id = 1, Name = "Ertem", Surname = "Egilmez" },
new Director { Id = 2, Name = "Peter", Surname = "Thorwarth" },
new Director { Id = 3, Name = "Chris", Surname = "Columbus" }
);
context.SaveChanges();
}
}
示例输入
{
"name": "string",
"price": 0,
"directorId": 1,
"genreId": 1,
"publishDate": "2020.1.1",
"actorsIds": [
1
]
}
我正在尝试将整数 ID 列表映射到演员列表,并在我输入演员 ID 之一的演员 ID 1 时出现“已添加具有相同键的项目。键:1”错误。
那么我应该如何配置自动映射器来执行此操作?
foreach (var actor in movie.Actors)
{
_context.Entry(actor).State = EntityState.Unchanged;
}
感谢@GertArnold
,我通过在 SaveChanges() 方法之前添加该代码解决了我的问题
电影实体
public class Movie
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string Name { get; set; }
public DateTime PublishDate { get; set; }
public Genre Genre { get; set; }
public int GenreId { get; set; }
public Director Director { get; set; }
public int DirectorId { get; set; }
public List<Actor> Actors { get; set; }
public decimal Price { get; set; }
}
CreateMovieM dto
public class CreateMovieM
{
public string Name { get; set; }
public decimal Price { get; set; }
public int DirectorId { get; set; }
public int GenreId { get; set; }
public string PublishDate { get; set; }
public List<int> ActorsIds { get; set; }
}
映射配置文件
CreateMap<int, Actor>()
.ForMember(dest => dest.Id, opt => opt.MapFrom(src => src));
CreateMap<CreateMovieM, Movie>()
.ForMember(dest => dest.Actors, opt => opt.MapFrom(src => src.ActorsIds));
创建命令
public class CreateMovieCommand
{
private readonly IMovieStoreDbContext _context;
private readonly IMapper _mapper;
private CreateMovieM _Model { get; set; }
public CreateMovieCommand(IMovieStoreDbContext context, IMapper mapper, CreateMovieM model)
{
_context = context;
_mapper = mapper;
_Model = model;
}
public void Handle()
{
var movie = _context.Movies.SingleOrDefault(x => x.Name == _Model.Name);
if (movie is not null)
throw new InvalidOperationException("Movie already exists");
movie = _mapper.Map<Movie>(_Model);
_context.Movies.Add(movie);
_context.SaveChanges();
}
}
这是数据生成器
public class DataGenerator
{
public static void Initialize(IServiceProvider services)
{
using var context = new MovieStoreDbContext(
services.GetRequiredService<DbContextOptions<MovieStoreDbContext>>());
var a1 = new Actor { Id = 1, Name = "Kemal", Surname = "Sunal" };
var a2 = new Actor { Id = 2, Name = "Peri", Surname = "Baumeister" };
var a3 = new Actor { Id = 3, Name = "Daniel", Surname = "Radcliffe" };
var m1 = new Movie { Name = "Blood Red Sky", GenreId = 1, DirectorId = 2, Price = 10, PublishDate = new DateTime(1999, 5, 19), Actors = new List<Actor> { a2 } };
var m2 = new Movie { Name = "Harry Potter", GenreId = 2, DirectorId = 3, Price = 15, PublishDate = new DateTime(1999, 5, 19), Actors = new List<Actor> { a3 } };
var m3 = new Movie { Name = "Hababam Sinifi", GenreId = 3, DirectorId = 1, Price = 20, PublishDate = new DateTime(1999, 5, 19), Actors = new List<Actor> { a1 } };
context.Movies.AddRange(
new Movie { Id = 1, Name = "Blood Red Sky", GenreId = 1, DirectorId = 2, Price = 10, PublishDate = new DateTime(1999, 5, 19), Actors = new List<Actor> { a2 } },
new Movie { Id = 2, Name = "Harry Potter", GenreId = 2, DirectorId = 3, Price = 15, PublishDate = new DateTime(1999, 5, 19), Actors = new List<Actor> { a3 } },
new Movie { Id = 3, Name = "Hababam Sinifi", GenreId = 3, DirectorId = 1, Price = 20, PublishDate = new DateTime(1999, 5, 19), Actors = new List<Actor> { a1 }, }
);
context.Genres.AddRange(
new Genre { Id = 1, Name = "Action" },
new Genre { Id = 2, Name = "Science Fiction" },
new Genre { Id = 3, Name = "Comedy" }
);
context.Directors.AddRange(
new Director { Id = 1, Name = "Ertem", Surname = "Egilmez" },
new Director { Id = 2, Name = "Peter", Surname = "Thorwarth" },
new Director { Id = 3, Name = "Chris", Surname = "Columbus" }
);
context.SaveChanges();
}
}
示例输入
{
"name": "string",
"price": 0,
"directorId": 1,
"genreId": 1,
"publishDate": "2020.1.1",
"actorsIds": [
1
]
}
我正在尝试将整数 ID 列表映射到演员列表,并在我输入演员 ID 之一的演员 ID 1 时出现“已添加具有相同键的项目。键:1”错误。
那么我应该如何配置自动映射器来执行此操作?
foreach (var actor in movie.Actors)
{
_context.Entry(actor).State = EntityState.Unchanged;
}
感谢@GertArnold
,我通过在 SaveChanges() 方法之前添加该代码解决了我的问题