簡體   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