EF5更新断开的图(n层)一种对多(EF5 update disconnected graph (n

2019-10-17 17:41发布

问题: 与父母与断开的图方案一一对多的关系插入/更新实体

UPDATE

我发现,问题只是用新的用户配置我添加到啤酒,第一次插入成功完成(= EF看到的关系,并建立正确的插入语句)

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

没办法,到现在有更新的工作。

---

父实体(啤酒)与排名一比一的关系,并与用户配置一个一对多的关系。 我使用的连接表的第二个关系。 我能够插入/当我插入更新等级/更新父啤酒厂(即使我不得不添加一些代码,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
    }
  }

当我试图为用户配置做同样的,显然EF对用户配置表执行的插入/更新(没用。我需要更新BreweryUserProfiles表)。 如果我理解正确,秩是工作,因为我有一个FK在Brewery.RankId财产,而我没有(和不想)啤酒和用户配置之间的双向导航

我希望我的问题是清楚的,我TRID粘贴所有相关的代码,但如果需要,我可以提供更多的信息。 提前致谢

文章来源: EF5 update disconnected graph (n-tier) one-to-many