EF Core. Обновить сущность без обновления свойств навигации - PullRequest
0 голосов
/ 22 марта 2019

Я пытаюсь обновить запись Entity EF Core следующим образом:

public class Customer
{
    public int Id { get; set; }
    public int Name { get; set; }
    ...
    public int CountryId { get; set; }
    public virtual Country Country { get; set; }

    public int ZoneId { get; set; }
    public virtual Zone Zone { get; set; }

    public ICollection<Service> Services { get; set; }

    public virtual ICollection<Invoice> Invoices { get; set; }
}

Когда я вызываю Context.Update () или Context.Add (), также обновляются объекты Zone и Country. Я не хочу, чтобы обновление виртуальных свойств. Я пытаюсь, с отражением, получить виртуальные свойства для указания, что Entry (virtualProperty) .State = EntityState.Detached, но я не могу. Это код, который я пытаюсь.

Type typeOfTEntity = typeof(TEntity);
foreach (var property in typeOfTEntity.GetProperties())
{
    if (property.GetGetMethod().IsVirtual)
    {
        foreach (var member in context.Context.Entry(CurrentItem).Members)
        {
            if (member.Metadata.Name == property.Name)
            {
                context.Context.Entry(member).State = EntityState.Detached;
            }
        }
    }
}

Я получаю сообщение об ошибке: «Тип объекта« ReferenceEntry »не найден. Убедитесь, что тип объекта был добавлен в модель». Я использую TEntity, потому что я использую больше сущностей в общем классе и использую один и тот же метод для обновления или добавления. Заранее спасибо.

Edit: Если я использую сущность (CurrentItem) как не универсальный тип: (CurrentItem теперь Клиент, а не TEntity)

context.Context.Entry(CurrentItem.Country).State = EntityState.Detached;
context.Context.SaveChanges();

Теперь работает хорошо. Но мне нужно использовать TEntity.

Ответы [ 2 ]

1 голос
/ 05 апреля 2019

Мне удалось решить проблему.Вместо того, чтобы вставлять свойство в Entry, нужно было ввести значение свойства.

using (var context = new OpenContext<TContext>(connectionString))
{
    var repository = context.UnitOfWork.GetRepository<TEntity, TKey>();
    repository.Update(CurrentItem);

    // Get the type of TEntity
    Type typeOfTEntity = typeof(TEntity);
    foreach (var property in typeOfTEntity.GetProperties())
    {
        // Check the properties that are virtual and not are HashSet
        if (property.GetGetMethod().IsVirtual && property.PropertyType.GenericTypeArguments.Count() == 0)
        {
            object value = property.GetValue(CurrentItem);
            // Check that value is not null and value type is an Entity
            if (value != null && value.GetType().IsSubclassOf(typeof(Entity<int>)))
            {
                // Set the value that I don't want to change
                context.Context.Entry(value).State = EntityState.Detached;
            }
        }
    }
    context.UnitOfWork.SaveChanges();
}

Спасибо за помощь.

0 голосов
/ 22 марта 2019

Если вы не хотите обновлять «сущности», вам не следует включать их, когда вы получаете клиента, которого не хотите обновлять.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...