Восстановите нейтральное предприятие от DbContext

Как я восстанавливаю нейтральные предприятия от DbContext?

Рассмотрите следующий тест:

    [Test]
    public void AddAndRetrieveUncommittedTenant()
    {
        _tenantRepository.Create("testtenant");
        var tenant = _tenantRepository.GetTenantByName("testtenant");

        Assert.AreEqual("testtenant", tenant.Name);
    }

Тест терпит неудачу, потому что , который арендатор пустой указатель .

Есть много определенного делового промежуточного кода, но он сводится к:

В моем Хранилище классифицирует метод , GetTenantByName в конце называет GetAll метод.

    public IQueryable GetAll()
    {
        return DbSet.AsQueryable();
    }

    private IDbSet DbSet
    {
        get { return Context.Set(); }
    }

и на классе, который расширяет DbContext , у меня есть следующий метод:

    public new IDbSet Set() where TEntity : class
    {
        return base.Set();
    }

When I put a breakpoint on return base.Set(); I can see that the entity is available in the repository (via the local property).


enter image description here


Как я могу восстановить нейтральное предприятие из своего хранилища?

1
nl ja de

1 ответы

Я использую класс, что я получаю на основании DbContext и добавляю следующий метод к доступу, что изменили предприятия. Это должно также сказать вам, как получить доступ к измененным предприятиям в вашем DbContext также:

public virtual IEnumerable ChangedEntities
{
    get { return base.ChangeTracker.Entries().Where(e => e.State != EntityState.Unchanged); }
}

ChangeTracker is a public property on DbContext, so you can also access this property from an external class as well:

var dirtyEntities = myDbContext.ChangeTracker.Entries().Where(e => e.state != EntityState.Unchanged);

Или, можно стать более конкретными, если вы хотите найти предприятия, которые были добавлены/изменены и т.д.:

var addedEntities = myDbContext.ChangeTracker.Entries().Where(e => e.state == EntityState.Added);
var modifiedEntities = myDbContext.ChangeTracker.Entries().Where(e => e.state == EntityState.Modified);

И так далее.

2
добавлено
Эй Брайан, это - вероятно, он. Я пытаюсь заставить от IEnumerable IEnumerable , который кажется более твердым, чем я ожидал. DbEntityEntry является некоторой невидимой оберткой вокруг моего предприятия и меня can' t, кажется, выводят его (хорошо, не так, чтобы компилятор согласился, время выполнения, я могу даже видеть свойства своего предприятия),
добавлено автор bas, источник
Первый шаг сделан теперь, я могу использовать ваш предложенный подход, чтобы восстановить предприятия в добавленном государстве. Проблема состоит в том, что мой текущий интерфейс IQueryable GetAll() , который я использую для , Включают навигационные свойства. Если я изменяю свой код, чтобы IEnumerable , я застреваю в остальной части моего делового кода. Но, хорошие новости, ваша часть, кажется, работает так I' ll принимают ответ и озадачивающее начало:). Спасибо Брайан!
добавлено автор bas, источник
@bas, да, EF обертывает ваше предприятие в некоторое динамическое полномочие это isn' t обязательно присваиваемый оригинальному типу предприятия (это I' найденный ve). Чего точно вы хотите достигнуть? у DbContext все еще будет фактическое предприятие (в его измененном государстве), таким образом, можно будет использовать ChangeTracker , чтобы получить идентификатор предприятия, которое было изменено, затем восстанавливает фактическое предприятие от DbContext ?
добавлено автор Brian S, источник
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot