导航属性无法正常工作

本文关键字:工作 常工作 属性 导航 | 更新日期: 2023-09-27 18:30:20

我使用最新版本的实体框架时遇到了一个关于导航属性的奇怪问题。

确实有一个实体,其中我有一些标记为虚拟的必需导航属性。请参阅下面的我的实体类:

public class Folder : UserReferencedEntityBase<int>
{
    #region Constructors
    public Folder()
    { }
    public Folder(IUnitOfWork unitOfWork)
        : base(unitOfWork)
    {
        ParentFolder = unitOfWork.Context.GetCurrentFolder as Folder;
    }
    #endregion
    #region Properties
    [Required]
    public string Name { get; set; }
    [Required]
    public string Data { get; set; }
    [Column(Order = 998)]
    public Folder ParentFolder { get; set; }
    [Required]
    public bool IsPublished { get; set; }
    #endregion
}

这个继承自UserReferencedEntityBase{T},看起来像:

public class UserReferencedEntityBase<TKey> : EntityBase<TKey>
{
    #region Constructors
    public UserReferencedEntityBase() { } 
    public UserReferencedEntityBase(IUnitOfWork unitOfWork)
    {
        unitOfWork.ThrowIfNull("unitOfWork");
        CreatedBy = unitOfWork.Context.GetCurrentUser;
    }
    #endregion
    #region Properties
    [Required]
    [Column(Order = 996)]
    public virtual IdentityUser CreatedBy { get; set; }
    [Column(Order = 997)]
    public virtual IdentityUser UpdatedBy { get; set; }
    #endregion
}

现在,我确实有我的 MVC 网站,我正在加载实体、更新属性并将其再次保存在数据库中:

var model = new FolderManager(UnitOfWork).GetFolder(id);
model.IsPublished = true;
UnitOfWork.Commit();

我在这里使用自定义工作单元,但根本没有火箭式。一切都在相同的上下文中发生,在相同的请求中,没有异步调用,...

当我执行代码时,我收到:

一个或多个实体的验证失败。有关更多详细信息,请参阅"实体验证错误"属性。

查看此内容,会显示以下错误:

"创建者字段是必填字段。"

现在,奇怪的是,当我调试代码时,上面给出的 3 行,created_by 属性被填充,代码确实执行没有任何问题。

我正在使用 ASP.NET 身份框架,因此在重要的情况下使用IdentityDbContext。

有人有头绪吗?

亲切问候

更新 - 文件夹管理器

经理只是一个包装器,用于将我的内容从我的工作单元中取出:

public Folder GetFolder(int id)
{
    return UnitOfWork.FolderRepository.GetByFilter(x => x.Id == id);
}

GetByFilter 方法的构造如下:

 public virtual TEntity GetByFilter(Func<TEntity, bool> filter)
 {
     DbSet.ThrowIfNull("DbSet");
     if (OnBeforeEntityGet != null)
     { OnBeforeEntityGet(this, new RepositoryEventArgs(typeof(TEntity))); }
     if (OnEntityGet != null)
     { OnEntityGet(this, new RepositoryEventArgs(typeof(TEntity))); }
     return !Entities.Any() ? null : !Entities.Where(filter).Any() ? null : Entities.First(filter);
 }

导航属性无法正常工作

只是想让你知道我已经找到了解决方案。似乎当您加载包含虚拟属性但从不检查它们的实体时,它们将保持 null,因此代码不起作用。

附加调试器后,它在检查此元素后工作正常。

这是正常行为吗?

亲切问候