使用实体框架6更新实体

时间:2016-02-04 08:50:18

标签: c# .net entity-framework entity-framework-6

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

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

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

  • 获取所有类型

  • 为所有艺术家插入ArtistGenre-relationship
  • 更新艺术家

    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();
}
  

为什么不插入我的关系?

提前致谢

1 个答案:

答案 0 :(得分:0)

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

  1. 从EF
  2. 加载实体
  3. 修改此实例
  4. 保存实例
  5. 如果您在外部管理实例,则EF将关联不同的实例,并且不会发现任何更改。您编写的代码手动标记为修改的代码不需要,因为EF会自己进行更改跟踪。即使您手动将状态置于修改状态,EF也只会重新扫描它已关联的实体(不等于您实际修改过的实体),并且不会发现任何更改。

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