[英]Updating entities with Entity Framework 6
我正在嘗試更新數據庫中的現有實體。 我想添加一個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();
}
為什么不插入我的關系?
提前致謝
在代碼中不太明顯的是,您將藝術家緩存在班級的私有成員中。 這意味着EF現在將了解這些實體。 正確執行工作單元模式如下:
如果您在外部管理實例,則EF將具有其他關聯的實例,並且找不到任何更改。 無需手動編寫將實體標記為已修改的代碼,因為EF會執行自己的更改跟蹤。 即使您手動將狀態修改,EF也會重新掃描它關聯的實體(不等於您實際修改的實體),也不會發現任何更改。
主要問題是為什么要在EF之外緩存這些藝術家。 這不是一個好習慣,通常您使用的服務器/客戶端不止一個,並且任何人都可以更新數據庫。 這些緩存的實例永遠不會知道這一點。 我將完全擺脫這種情況,並始終從EF重新加載實體。 然后,無論誰更新了數據庫,您都確保始終獲得最新狀態。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.