Sql 实体框架6多对多希望插入重复行
不应该这么难!我即将放弃EF 我的模特有周报版。每个版本可以有许多分类广告。每个分类可以出现在一个或多个版本中。我的模型:Sql 实体框架6多对多希望插入重复行,sql,entity-framework,Sql,Entity Framework,不应该这么难!我即将放弃EF 我的模特有周报版。每个版本可以有许多分类广告。每个分类可以出现在一个或多个版本中。我的模型: public class Classifieds { [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int ClassifiedId { get; set; } ... public virtual ICollection<EditionModel> Edit
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; }
}
为什么EF坚持希望在EditionModels中插入重复的行,而不只是将连接表行链接到其中的现有行?我该怎么做 显然
PopulateEditionList()
没有将版本附加到上下文。在foreach
循环中添加此行:
db.Set().Attach(anEd);
也许你可以简化整个过程。我不知道你为什么把这些版本载入内存。您可以基于密钥创建一个“存根实体”,该密钥足以创建关系。此外,将分类广告
附加到上下文似乎是多余的,因为您希望将其作为新实体添加到数据库中。尝试从数据库中为数据库中尚不存在的父实体加载相关版本似乎也是多余的。结果只能是空集合
因此,以下更简单的版本可能也适用:
公共异步任务创建(Classifieds Classifieds,int[]EditionList)
{
classifieds.edives=新列表();
foreach(编辑列表中的var p)
{
var anEd=neweditionmodel{EditionId=p};
db.Set().Attach(anEd);
分类广告。版本。添加(anEd);
}
//...
if(ModelState.IsValid)
{
var ads=db.Classifieds.Add(Classifieds);
wait db.SaveChangesAsync().configurewait(false);
返回视图(“收据”,分类);
}
//...
}
问题在于EditionModel不是上下文的一部分。谢谢你,斯劳玛为我指明了正确的方向。更正的创建操作是:
...
classifieds.Editions = new List<EditionModel>();
foreach (var p in EditionList)
{
var ed = await db.EditionModel.FindAsync(p);
if (ed == null)
ed = new EditionModel { EditionId = p, PublicationDate = (from q in allPubs where q.EditionId == p select q).Single().PublicationDate };
InsertOrUpdate<EditionModel>(ed);
classifieds.Editions.Add(ed);
}
...
。。。
classifieds.edives=新列表();
foreach(编辑列表中的var p)
{
var ed=等待db.EditionModel.FindAsync(p);
如果(ed==null)
ed=neweditionmodel{EditionId=p,PublicationDate=(从所有Pubs中的q开始,其中q.EditionId==p选择q);
插入更新(ed);
分类广告。版本。添加(ed);
}
...
代码的其余部分如上所述。感谢您的回复,Slauma。您提出的解决方案不起作用,MSSQL试图向EditionModels表中添加重复的行。这是我最初的问题。。。以下是输出:INSERT语句与外键约束“FK_dbo.EditionModelClassifieds_dbo.EditionId”冲突。冲突发生在数据库“ipdb”、表“dbo.EditionModels”、列“EditionId”中。声明已终止。
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'.
...
classifieds.Editions = new List<EditionModel>();
foreach (var p in EditionList)
{
var ed = await db.EditionModel.FindAsync(p);
if (ed == null)
ed = new EditionModel { EditionId = p, PublicationDate = (from q in allPubs where q.EditionId == p select q).Single().PublicationDate };
InsertOrUpdate<EditionModel>(ed);
classifieds.Editions.Add(ed);
}
...