1

問題: 切断されたグラフのシナリオで、1対多の関係を持つ親に関連するエンティティを挿入/更新します

アップデート

問題は、醸造所に追加した新しいUserProfileにあることがわかりました。最初の挿入は正常に実行されます(= EFは関係を確認し、正しい挿入ステートメントを作成します)

exec sp_executesql N'insert [dbo].[BreweryUserProfiles]([BreweryId], [UserId])
values (@0, @1)
',N'@0 int,@1 int',@0=12,@1=3

これまで、アップデートを機能させる方法はありません。

---

親エンティティ(Brewery)は、Rankと1対1の関係にあり、UserProfileと1対多の関係にあります。この2番目の関係には結合テーブルを使用しました。親醸造所を挿入/更新するときにランクを挿入/更新することができます(コードを追加する必要があったとしても、EFは関係を維持できませんでした)。ユーザープロファイルを挿入/更新できません

参照:ここで説明されているように、汎用リポジトリとdbcontextextensionを使用しています:http://www.martinwilley.com/net/code/data/genericrepository.html

DB図

ここに画像の説明を入力してください

POCO

  [Table("Breweries")]
  public class Brewery : ABrewery
  {
    //PK
    public int BreweryId { get; set; }

    //FK
    public int RankId { get; set; }

    ...

    //Navigation
    public virtual ICollection<BrewMaster> BrewMasters { get; set; }
    public virtual ICollection<UserProfile> UserProfiles { get; set; }
    public virtual Country Country { get; set; }
    public virtual Rank Rank { get; set; }
  }

  public class Rank : IRank
  {
    public int RankId { get; set; }
    public int TotalHits { get; set; }
    public decimal Value { get; set; }
  }

[Table("UserProfiles")]
public class UserProfile : IUserProfile
{
  [Key]
  public int UserId { get; set; }
  public string UserName { get; set; }

  ...

  //Navigation
  public virtual List<Email> Emails { get; set; }
  public virtual List<Social> Socials { get; set; }
  public virtual List<Telephone> Telephones { get; set; }
  public virtual Country Country { get; set; }
}

エンティティ(醸造所)の構成

  HasMany(e => e.UserProfiles)
    .WithMany()
    .Map(m =>
    {
      m.MapLeftKey("BreweryId");
      m.MapRightKey("UserId");
      m.ToTable("BreweryUserProfiles");
    });

  Property(e => e.RankId)
    .IsRequired();

解決策を試しました

ランクを挿入/更新するには、それを行うのに十分でした

public void AddOrUpdate(Brewery entity)
{
  entity.RankId = entity.Rank.RankId;

  _context.AddOrUpdate<Rank>(entity.Rank); //add or update is a dbcontextextension, 
                                           //basically just Add or 
                                           //Attach + change entity status

  _repository.AddOrUpdate(entity);

BreweryUserProfilesを更新するには、次のことを試みました。

  if (entity.UserProfiles.Count > 0)
  {
    entity.UserProfiles = new List<UserProfile>();
    foreach (var user in entity.UserProfiles)
    {
      entity.UserProfiles.Add(GetUserProfile(user.UserId)); //get userprofile from db
    }
  }

  _repository.AddOrUpdate(entity);

また

  if (entity.UserProfiles.Count > 0)
  {
    entity.UserProfiles = new List<UserProfile>();
    foreach (var user in entity.UserProfiles)
    {
      _context.AddOrUpdate<UserProfile>(this.GetUserProfile(user.UserId)); //that basically is the same
    }
  }

UserProfileに対して同じことを行おうとすると、明らかにEFがUserProfileテーブルに対して挿入/更新を実行しました(役に立たない.. BreweryUserProfilesテーブルを更新する必要があります)。私が正しく理解していれば、ランクは機能しています。これは、Brewery.RankIdプロパティにFKがあり、BreweryとUserProfileの間の双方向ナビゲーションがない(そして望まない)ためです。

問題が明確であることを願っています。関連するすべてのコードを貼り付けようとしましたが、必要に応じて、より多くの情報を提供できます。前もって感謝します

4

0 に答える 0