繁体   English   中英

导航属性无法正常工作

[英]Navigation Properties are not working properly

我正在使用有关导航属性的最新版本的Entity Framework查询一个奇怪的问题。

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

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();

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

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

一个或多个实体的验证失败。 有关更多详细信息,请参见'EntityValidationErrors'属性。

看看这个,发现以下错误:

“ CreatedBy字段为必填。”

现在,这很奇怪,当我调试我的代码时,上面给出的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);
 }

只想让您知道我已经找到了解决方案。 看起来,当您加载包含虚拟属性的实体但从不检查它们时,它们保持为空,因此代码无法正常工作。

附加了调试器后,检查该元素后,它就可以轻松运行了。

这是正常行为吗?

亲切的问候,

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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