簡體   English   中英

使用Entity Framework 6更新實體

[英]Updating entities with Entity Framework 6

我正在嘗試更新數據庫中的現有實體。 我想添加一個m:n關系。

這是我嘗試做到的方式:

  • 從數據庫中獲取所有藝術家
  • 識別尚未在數據庫中的藝術家
  • 保存新藝術家

  • 獲取所有流派

  • 為所有藝術家插入ArtistGenre關系
  • 更新藝術家

     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現在將了解這些實體。 正確執行工作單元模式如下:

  1. 從EF加載實體
  2. 修改這個實例
  3. 保存實例

如果您在外部管理實例,則EF將具有其他關聯的實例,並且找不到任何更改。 無需手動編寫將實體標記為已修改的代碼,因為EF會執行自己的更改跟蹤。 即使您手動將狀態修改,EF也會重新掃描它關聯的實體(不等於您實際修改的實體),也不會發現任何更改。

主要問題是為什么要在EF之外緩存這些藝術家。 這不是一個好習慣,通常您使用的服務器/客戶端不止一個,並且任何人都可以更新數據庫。 這些緩存的實例永遠不會知道這一點。 我將完全擺脫這種情況,並始終從EF重新加載實體。 然后,無論誰更新了數據庫,您都確保始終獲得最新狀態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM