我遇到了严重的Entity Framework问题,我无法解决这个问题。 我有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。 然后我将该章传递给标题,但是这里不是创建带有正确章节的标题,而是添加一个新章节并链接到创建的标题。
这让我疯了。
答案 0 :(得分:2)
每个UnitOfWork都有自己的上下文实例,所有实例都保存在这里。
您必须在所有存储库中共享单个上下文。