问题: 在断开连接的图形场景中插入/更新与具有一对多关系的父级相关的实体。
更新
我发现问题只是我添加到 Brewery 的新用户配置文件,第一次插入成功完成(= EF 看到关系并创建正确的插入语句)
exec sp_executesql N'insert [dbo].[BreweryUserProfiles]([BreweryId], [UserId])
values (@0, @1)
',N'@0 int,@1 int',@0=12,@1=3
直到现在还没有办法让更新正常工作。
---
父实体(Brewery)与 Rank 是一对一的关系,与 UserProfile 是一对多的关系。我为第二个关系使用了一个连接表。当我插入/更新父啤酒厂时,我能够插入/更新等级(即使我必须添加一些代码,EF 也无法保持这种关系)。我无法插入/更新用户资料
参考:我使用的是通用存储库 + dbcontextextension,如下所述:http: //www.martinwilley.com/net/code/data/genericrepository.html
数据库图
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();
尝试过的解决方案
插入/更新 Rank 就足够了
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 表)。如果我理解正确,Rank 正在工作,因为我在 Brewery.RankId 属性中有一个 FK,而我没有(也不想要)Brewery 和 UserProfile 之间的双向导航
我希望我的问题很清楚,我尝试粘贴所有相关代码,但如果需要,我可以提供更多信息。提前致谢