![](/img/trans.png)
[英]Entity Framework adding existing Child to a new Parent on a many to many relation
[英]Entity Framework: Adding entity with relation, a new entity is created
我在使用实体框架时遇到了严重的问题,无法解决。 我有2个实体,一个章节和一个标题,标题通过使用导航属性链接到章节。
[Table("T_CHAPTER")]
public class Chapter : EntityBase<int>
{
[Required]
[Column(Order = 1)]
public string Name { get; set; }
}
[Table("T_HEADER")]
public class Header : EntityBase<int>
{
[Required]
[Column(Order = 1)]
public string Name { get; set; }
[Required]
[Column(Order = 2)]
public virtual Chapter Chapter { get; set; }
}
到目前为止,这里还算不错。 现在,我想告诉我我正在使用工作单元和存储库模式,但是我认为这并不介意。
首先,我将在各章中添加一条记录(如果该记录不存在),该记录将通过以下代码完成:
private Chapter CreateChapter(string chapter)
{
var retrievedChapter = UnitOfWork.ChapterRepository.Get(x => x.Name.Equals(chapter, StringComparison.InvariantCultureIgnoreCase));
if (retrievedChapter == null)
{
UnitOfWork.ChapterRepository.Insert(new Chapter { Name = chapter });
UnitOfWork.Commit();
retrievedChapter = UnitOfWork.ChapterRepository.Get(x => x.Name.Equals(chapter, StringComparison.InvariantCultureIgnoreCase));
}
return retrievedChapter;
}
Insert方法如下:
public virtual void Insert(TEntity entity)
{
if (OnBeforeEntityInsert != null)
{ OnBeforeEntityInsert(this, new RepositoryEventArgs(typeof(TEntity), entity)); }
DbSet.Add(entity);
if (OnEntityInsert != null)
{ OnEntityInsert(this, new RepositoryEventArgs(typeof(TEntity), entity)); }
}
这是Commit方法:
public void Commit()
{
if (OnBeforeCommit != null)
{ OnBeforeCommit(this, EventArgs.Empty); }
RepositoriesContexts.Each(context => context.SaveChanges());
if (OnCommit != null)
{ OnCommit(this, EventArgs.Empty); }
}
每个UnitOfWork都有自己的上下文实例,所有实例都保存在这里。
然后,我使用以下代码创建标头:
private Header CreateHeader(Chapter chapter, string header)
{
var retrievedHeader = UnitOfWork.HeaderRepository.Get(x => x.Name.Equals(header, StringComparison.InvariantCultureIgnoreCase) &&
x.Chapter.Id == chapter.Id);
if (retrievedHeader == null)
{
UnitOfWork.HeaderRepository.Insert(new Header { Name = header, Chapter = chapter });
UnitOfWork.Commit();
retrievedHeader = UnitOfWork.HeaderRepository.Get(x => x.Name.Equals(header, StringComparison.InvariantCultureIgnoreCase) &&
x.Chapter.Id == chapter.Id);
}
return retrievedHeader;
}
现在,假设我通过此方法添加了一个章节,并且创建的章节的ID为1。然后将该章节传递给标题,但是这里不是用正确的章节创建标题,而是添加并链接了新章节。到创建的标题。
它让我发疯。
每个UnitOfWork都有自己的上下文实例,所有实例都保存在这里。
您必须在所有存储库中共享一个上下文。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.