实体框架更新记录不起作用

时间:2016-11-20 13:58:37

标签: c# .net entity-framework asp.net-web-api

您好我在尝试使用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();
    }

0 个答案:

没有答案