实体框架:使用关系添加实体,创建新实体

时间:2014-10-06 13:37:29

标签: c# entity-framework

我遇到了严重的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。 然后我将该章传递给标题,但是这里不是创建带有正确章节的标题,而是添加一个新章节并链接到创建的标题。

这让我疯了。

1 个答案:

答案 0 :(得分:2)

  

每个UnitOfWork都有自己的上下文实例,所有实例都保存在这里。

您必须在所有存储库中共享单个上下文。