Как избежать извлечения реляционных объектов в цикле реляционных ссылок с использованием Entity Framework?

* «Я лично полагаюсь на обнуление переменных в качестве заполнителя для последующего правильного удаления. Например, я трачу время, чтобы свернуть все элементы массива до фактического удаления (создания нулевого) самого массива.»

Это не нужно. Как работает Java GC, он находит объекты, которые не имеют к ним ссылок, поэтому, если у меня есть Object x с ссылкой (= variable) a, которая указывает на него, GC не удалит его, потому что есть ссылка к этому объекту:

a -> x

Если вы допустили null, это произойдет:

a -> null
     x

Итак, теперь x не имеет ссылки, указывающей на него, и будет удален. То же самое происходит, когда вы устанавливаете ссылку на другой объект, кроме x.

Итак, если у вас есть массив arr, который ссылается на объекты x, y и z и переменную a, которая ссылается на массив, выглядит так:

a -> arr -> x
         -> y
         -> z

Если вы null, чем это происходит:

a -> null
     arr -> x
         -> y
         -> z

Таким образом, GC обнаруживает, что arr не имеет ссылки на него и удаляет его, что дает вам эта структура:

a -> null
     x
     y
     z

Теперь GC находит x, y и z и удаляет их также. Отброс каждой ссылки в массиве не будет делать ничего лучше, он просто будет использовать время и пространство процессора в коде (это говорит, что это не повредит дальше. GC все равно сможет выполнить так, как это должно быть ).

0
задан Argiris Mouratidis 19 March 2019 в 10:47
поделиться

1 ответ

Я бы предложил создать дополнительный пользовательский объект и отобразить поля (либо вручную, либо с использованием инфраструктуры, такой как AutoMapper).

Применительно к вашему примеру это может выглядеть примерно так:

public class CustomObjectA
{
    public int Id { get; set; }
    public string stampleProperty { get; set; }
    public string stampleProperty2 { get; set; }
    public CusomObjectB[] B { get; set; }
}

public class CustomObjectB
{
    public int BId { get; set; }
    public string sampleProperty3{ get; set; }        
    public string sampleProperty4{ get; set; }
    public int ComyId { get; set; }
}

И использование будет выглядеть так:

var a = db.A.FirstOrDefault(a => a.stampleProperty== stampleProperty);

var obj= new CustomObjectA
{
    Id = a.AId,
    sampleProperty= a.sampleProperty,
    sampleProp= a.sampleProp,
    B = a.B.Select(b => new CustomObjectB
    {
        BId = b.BId,
        sampleProperty3 = b.sampleProperty3

        //etc...
    }).ToArray()
};

Не обязательно хорошая идея возвращать объекты базы данных напрямую по API по этим причинам (наряду с некоторыми другими, например, вы не хотите, чтобы третьи стороны, использующие ваш API, могли видеть каждое свойство в базе данных).

Общим термином для этого подхода является использование DTO (объектов передачи данных). Вот учебник от Microsoft, где они обсуждают его далее https://docs.microsoft.com/en-us/aspnet/web-api/overview/data/using-web-api-with-entity-framework/part -5 .

0
ответ дан rashleighp 19 March 2019 в 10:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: