gpt4 book ai didi

sql - Entity Framework 6 多对多想插入重复行

转载 作者:行者123 更新时间:2023-12-04 04:33:26 28 4
gpt4 key购买 nike

不应该这么难!我要放弃EF了...

我的模型有周报版。每个版本可以有许多分类。每个分类可以出现在一个或多个版本中。我的模型:

public class Classifieds
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ClassifiedId { get; set; }
...
public virtual ICollection<EditionModel> Editions { get; set; }
}

public class EditionModel
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
public int EditionId { get; set; } // This is YYYYWW, WW = week number
public Date PublicationDate { get; set; }
public virtual ICollection<Classifieds> Classifieds { get; set; }
}

OnModelCreating 覆盖:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<EditionModel>()
.Property(z => z.EditionId)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

modelBuilder.Entity<EditionModel>()
.HasMany(c => c.Classifieds)
.WithMany(d => d.Editions)
.Map(x =>
{
x.MapLeftKey("EditionId");
x.MapRightKey("ClassifiedId");
x.ToTable("EditionModelClassifieds");
});
base.OnModelCreating(modelBuilder);
}

创建分类广告操作代码(HTTP 放置):
public async Task<ActionResult> Create(Classifieds classifieds, int[] EditionList)
{
var allPubs = PopulateEditionList(); // Current and next 12 editions
db.Set<Classifieds>().Attach(classifieds);
db.Entry(classifieds).Collection(x => x.Editions).Load();
foreach (var p in EditionList)
{
var anEd = (from x in allPubs where x.EditionId == p select x).Single();
classifieds.Editions.Add(anEd);
}
...
if (ModelState.IsValid)
{
var ads = db.Classifieds.Add(classifieds);
await db.SaveChangesAsync().ConfigureAwait(false);
return View("Receipt", classifieds);
}
...
}

在提交新的分类信息时,我得到
Violation of PRIMARY KEY constraint 'PK_dbo.EditionModels'.  
Cannot insert duplicate key in object 'dbo.EditionModels'.

为什么 EF 坚持要在 EditionModels 中插入重复的行,而不是仅仅将联结表行链接到其中的现有行?我该如何解决这个问题?

最佳答案

显然 PopulateEditionList()不将版本附加到上下文中。在 foreach 中添加这一行循环:

db.Set<EditionModel>().Attach(anEd);

也许你可以简化整个过程。我不确定您为什么将版本加载到内存中。您可以根据足以创建关系的键创建一个“ stub 实体”。还附上 classifieds上下文似乎是多余的,因为您想将其作为新实体添加到数据库中。尝试从数据库中为数据库中尚不存在的父实体加载相关版本似乎也是多余的。结果只能是一个空集合。

因此,以下更简单的版本也可能适用:

public async Task<ActionResult> Create(Classifieds classifieds, int[] EditionList)
{
classifieds.Editions = new List<EditionModel>();
foreach (var p in EditionList)
{
var anEd = new EditionModel { EditionId = p };
db.Set<EditionModel>().Attach(anEd);
classifieds.Editions.Add(anEd);
}
//...
if (ModelState.IsValid)
{
var ads = db.Classifieds.Add(classifieds);
await db.SaveChangesAsync().ConfigureAwait(false);
return View("Receipt", classifieds);
}
//...
}

关于sql - Entity Framework 6 多对多想插入重复行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20157533/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com