Как я могу создавать и заполнять вложенные/сложные объекты с помощью Select() в Entity Framework 6?C#

Место общения программистов C#
Ответить
Anonymous
 Как я могу создавать и заполнять вложенные/сложные объекты с помощью Select() в Entity Framework 6?

Сообщение Anonymous »

Я пытаюсь перенести некоторый код, написанный с помощью Entity Framework Core, в Entity Framework 6. Я столкнулся с проблемой, из-за которой EF Core может успешно создать экземпляр сложного DTO (т. е. объекта с подобъектом) в инструкции Select(), но EF 6 не может этого сделать.
Я не знаю, связана ли проблема с новой функцией EF Core, которой нет в EF 6 или, что более важно, как я могу добиться той же функциональности с помощью EF 6.
Рассмотрим следующий код установки:

Код: Выделить всё

public class Outer
{
[Key]
public int OuterId { get; set; }
public string Name { get; set; }
public HashSet Inners { get; set; }
}

public class Inner
{
[Key]
public int InnerId { get; set; }
public string Type { get; set; }
}

public class MyDbContext : DbContext
{
public DbSet Outers { get; set; }
// ...override OnConfiguring() and set provider, e.g. 'UseSqlServer()'...
}

public class OuterDTO
{
public string Name { get; set; }
public IReadOnlyCollection Inners { get; set; }
}

public class InnerDTO
{
public string Type { get; set; }
}
В Entity Framework Core следующий код не будет вызывать ошибки. Он преобразует каждый объект Outer (с вложенными объектами Inner) в объект OuterDTO (с вложенными объектами InnerDTO).

Код: Выделить всё

using (MyDbContext db = new MyDbContext())
{
IQueryable query = db.Outers.Select(entity => new OuterDTO {
Name = entity.Name,
Inners = entity.Inners.Select(inner => new InnerDTO {
Type = inner.Type
}).ToList()
}).ToList();

List outers = query.ToList();
Console.WriteLine(outers);
}
Однако в Entity Framework 6 я получаю сообщение об ошибке.

Типы аргументов не совпадают

Однако странно, что меняется создание экземпляра внешнего объекта (

Код: Выделить всё

OuterDTO
) к анонимному объекту не приводит к ошибкам:

Код: Выделить всё

...db.Outers.Select(entity => new { ... })...
Я знаю, что мог бы загрузить каждую часть в память, а затем назначить соответствующие свойства, но это было бы критическим изменением — я пытаюсь сохранить инициализацию внешнего объекта внутри IQueryable.
Невозможно ли добиться этого с помощью Entity Framework 6? Или я что-то упускаю из виду?

Подробнее здесь: https://stackoverflow.com/questions/797 ... t-in-entit
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»