Проверяет ли EntityReference.Load наличие EntityReference.IsLoaded? - PullRequest
0 голосов
/ 16 ноября 2009

Привет, мне было интересно, если EntityReference.Load метод включает

If Not ref.IsLoaded Then ref.Load()

Мой вопрос в основном:

Dim person = Context.Persons.FirstOrDefault
person.AddressReference.Load()
person.AddressReference.Load() 'Does it do anything?

Ответы [ 2 ]

2 голосов
/ 17 ноября 2009

Это снова загрузить. Я подтвердил это с помощью Profiler, и он показал два запроса. Опция слияния по умолчанию - MergeOption.AppendOnly, и она не препятствует повторному запросу Код от отражателя:

public override void Load(MergeOption mergeOption)
{
    base.CheckOwnerNull();
    ObjectQuery<TEntity> query = base.ValidateLoad<TEntity>(mergeOption, "EntityReference");
    base._suppressEvents = true;
    try
    {
        List<TEntity> collection = new List<TEntity>(RelatedEnd.GetResults<TEntity>(query));
        if (collection.Count > 1)
        {
            throw EntityUtil.MoreThanExpectedRelatedEntitiesFound();
        }
        if (collection.Count == 0)
        {
            if (base.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.One)
            {
                throw EntityUtil.LessThanExpectedRelatedEntitiesFound();
            }
            if ((mergeOption == MergeOption.OverwriteChanges) || (mergeOption == MergeOption.PreserveChanges))
            {
                EntityKey entityKey = ObjectStateManager.FindKeyOnEntityWithRelationships(base.Owner);
                EntityUtil.CheckEntityKeyNull(entityKey);
                ObjectStateManager.RemoveRelationships(base.ObjectContext, mergeOption, (AssociationSet) base.RelationshipSet, entityKey, (AssociationEndMember) base.FromEndProperty);
            }
            base._isLoaded = true;
        }
        else
        {
            base.Merge<TEntity>(collection, mergeOption, true);
        }
    }
    finally
    {
        base._suppressEvents = false;
    }
    this.OnAssociationChanged(CollectionChangeAction.Refresh, null);
}
0 голосов
/ 14 марта 2014

Просто для справки, для тех, кто находит приемлемый ответ, вот метод расширения, который я создал для моего текущего проекта.

using System.Data.Objects.DataClasses;

namespace ProjectName
{
    public static class EntityFrameworkExtensions
    {
        public static void EnsureLoaded<TEntity>(this EntityReference<TEntity> reference)
            where TEntity : class, IEntityWithRelationships
        {
            if (!reference.IsLoaded)
                reference.Load();
        }
    }
}

И использование:

Patient patient = // get patient

patient.ClinicReference.EnsureLoaded();
patient.Clinic.DoStuff();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...