繁体   English   中英

实体框架:添加具有关系的实体,创建一个新实体

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM