您好我在尝试使用Entity Framework对嵌套集合进行更新时遇到了一些问题。我正在使用Entity Framework Core,但我不知道这是否会对此问题产生影响。
应用程序应该允许人们在照片中标记和取消标记。
我正在使用WebApi并尝试发送补丁来更新一些细节,但更新似乎不起作用。
以下是数据模型:
这是我的Photo类
public class Photo
{
private Photo() { }
public Photo(string title, string location)
{
CreatedDate = DateTime.UtcNow;
Title = title;
Location = location;
Persons = new HashSet<PersonPhoto>();
}
public int Id { get; set; }
public string Title { get; private set; }
public string Location { get; private set; }
public DateTime CreatedDate { get; private set; }
public ICollection<PersonPhoto> Persons { get; set; }
}
这是我的Person类
public class Person
{
public Person()
{
Photos = new HashSet<PersonPhoto>();
}
public Person(string firstName, string lastName, DateTime dateOfBirth)
{
FirstName = firstName;
LastName = lastName;
DateOfBirth = dateOfBirth;
CreatedDate = DateTime.UtcNow;
}
public int Id { get; set; }
public string FirstName { get; private set; }
public string LastName { get; private set; }
public DateTime? DateOfBirth { get; private set; }
public DateTime CreatedDate { get; private set; }
public DateTime? LastModified { get; set; }
public ICollection<PersonPhoto> Photos { get; set; }
}
这是我的PersonPhoto类
public class PersonPhoto
{
public int PersonId { get; set; }
public Person Person { get; set; }
public int PhotoId { get; set; }
public Photo Photo { get; set; }
}
我发送一个包含PhotoViewModel的JsonPatch文档到端点,我希望结果能够更新或删除PhotoPerson连接表的记录。
这是PhotoViewModel
public class PhotoViewModel
{
public int Id { get; set; }
public string Title { get; set; }
public string Location { get; set; }
public List<int> Persons { get; set; }
}
以下是我要发布的端点:
public IActionResult TagPhoto(int id, [FromBody]JsonPatchDocument<PhotoViewModel> patch)
{
// Get Photo first
var photos = _uow.Photos.GetPhoto(id);
var photoVM = Mapper.Map<Photo, PhotoViewModel>(photos);
patch.ApplyTo(photoVM);
var photo = Mapper.Map<PhotoViewModel, Photo>(photoVM);
foreach (var i in photoVM.Persons)
{
photo.Persons.Add(new PersonPhoto()
{
PersonId = i
});
}
_uow.Photos.UpdatePhoto(photo);
_uow.Complete();
return Ok();
}
将PhotoViewModel映射到Photo Entity的映射器如下所示:
Mapper.CreateMap<PhotoViewModel, Photo>()
.ForMember(dest => dest.Persons,
opts => opts.Ignore());
将Photo Entity映射到PhotoViewModel的映射器如下所示:
Mapper.CreateMap<Photo, PhotoViewModel>()
.ForMember(vm => vm.Persons,
map => map.MapFrom(p => p.Persons.Select(c => c.PersonId)));
并且处理数据访问的存储库具有以下更新方法:
public void UpdatePhoto(Photo photo)
{
contextTest.Entry(photo).State = EntityState.Modified;
}
目前正在发生什么:
如果我更新除人员集合之外的PhotoViewModel属性,则相应地更新数据库。 Sql Profiler显示update语句包含新的属性更改(例如标题)但是当我尝试更新嵌套集合时,数据库中没有任何事情发生,并且sql profiler没有提到嵌套集合。它似乎忽略了它。
我尝试了一些不同的东西。我将存储库更改为更新如下:
_context.Photos.Update(照片) 这只是继续在连接表中添加新记录(也是重复的)当我尝试从嵌套集合中删除时,不会从连接表中删除任何内容。
我错过了一些非常明显的东西吗?我一直在网上寻找,但我真的看不到解决方案。
非常感谢任何帮助!
**编辑**
我的UnitOfWork中的_context.SaveChanges()ocurrs:
public void Complete()
{
_context.SaveChanges();
}