我正在尝试更新数据库中的现有实体。
我想添加一个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();
}
为什么不插入我的关系?
提前致谢
答案 0 :(得分:0)
您的代码中不太明显的是您将艺术家缓存在班级的私人成员中。这意味着EF现在将了解这些实体。工作单元模式的正确实现如下:
如果您在外部管理实例,则EF将关联不同的实例,并且不会发现任何更改。您编写的代码手动标记为修改的代码不需要,因为EF会自己进行更改跟踪。即使您手动将状态置于修改状态,EF也只会重新扫描它已关联的实体(不等于您实际修改过的实体),并且不会发现任何更改。
主要问题是为什么要将这些艺术家缓存在EF之外。这不是一个好习惯,一般来说,您使用的服务器/客户端不止一个,任何人都可以更新数据库。这些缓存的实例永远不会知道这一点。我会完全摆脱这种情况,并从EF重新加载实体。然后,无论谁更新了数据库,您都可以确保始终获得最新状态。