使用实体框架更新实体 6.

本文关键字:实体 更新 框架 | 更新日期: 2023-09-27 18:33:07

我正在尝试更新数据库中的现有实体。我想添加一个m:n关系。

这就是我尝试这样做的方式:

  • 从数据库中获取所有艺术家
  • 识别尚未进入数据库的艺术家
  • 保存新艺术家

  • 获取所有流派

  • 插入艺术家所有艺术家的流派关系
  • 更新艺术家

    public void SyncArtists(ICollection<FullArtistWrapper> fullArtists)
    {
        using (var unitOfWork = UnitOfWorkFactory.CreateUnitOfWork())
        {
            var dbArtists = unitOfWork.Repository<IArtistRepository>().GetArtists().ToList();
            var newArtists = fullArtists.Where(s => dbArtists.All(d => d.ArtistId != s.Id)).ToList();
            var artistsToInsert = newArtists.Select(artist =>
                new Artist
                {
                    ArtistId = artist.Id,
                    Name = artist.Name
                }).ToList();
            unitOfWork.Repository<IArtistRepository>().InsertEntities(artistsToInsert);
            unitOfWork.Commit();
            // dbArtists.AddRange(artistsToInsert);
            var allArtists = unitOfWork.Repository<IArtistRepository>().GetArtists().ToList();
            var allGenres = unitOfWork.Repository<IGenreRepository>().GetGenres();
            foreach (var artist in allArtists)
            {
                var fullArtist = fullArtists.Single(f => f.Id == artist.ArtistId);
                var assignedDbGenres = allGenres.Where(g => fullArtist.Genres.Any(f => f == g.Name));
                artist.Genres.AddRange(assignedDbGenres);
            }
            unitOfWork.Repository<IArtistRepository>().UpdateEntities(allArtists);
            unitOfWork.Commit();
        }
    }
    

我的实体如下所示:

public class Artist : PersistenceEntity
{
    public Artist()
    {
        Genres = new List<Genre>();
    }
    [Key]
    public string ArtistId { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Genre> Genres { get; set; }
}
public class Genre : PersistenceEntity
{
    [Key]
    public int GenreId { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Artist> Artist { get; set; }
}

问题如下:

  • 我在数据库中确实有流派(它们在前面的步骤中保存(
  • 艺术家
  • 正确保存,所有艺术家都在数据库中
  • 但是关系没有得到更新

为什么会这样呢?我的UpdateEntities方法如下所示:

public void UpdateEntities<TPersistentEntity>(ICollection<TPersistentEntity> persistentEntitiesToBeUpdated) where TPersistentEntity : PersistenceEntity
{
    persistentEntitiesToBeUpdated.ForEach(UpdateAndSave);
}
public void Update(PersistenceEntity entity)
{
    Context.Entry(entity).State = EntityState.Modified;
}
public void UpdateAndSave(PersistenceEntity entity)
{
    Update(entity);
    Context.SaveChanges();
}

为什么没有插入我的关系?

提前致谢

使用实体框架更新实体 6.

在您的代码中不太明显的是,您将艺术家缓存在类中的私有成员中。这意味着 EF 现在将了解这些实体。工作单元模式的正确实现如下:

  1. 从 EF 加载实体
  2. 修改此实例
  3. 保存实例

如果在外部管理实例,EF 将关联不同的实例,并且不会找到任何更改。 不需要手动将实体标记为已修改的代码,因为 EF 会执行自己的更改跟踪。即使手动将状态设置为"已修改",EF 也只会重新扫描它关联的实体(不等于实际修改的实体(,并且不会发现任何更改。

主要问题是为什么要在 EF 之外缓存这些艺术家。这不是好的做法,通常您有多个服务器/客户端正在使用,并且任何人都可以更新数据库。这些缓存的实例永远不会知道这一点。我将完全摆脱这种情况并始终从 EF 重新加载实体。然后,确保无论谁更新了数据库,始终获得最新状态。