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

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

Сообщение Anonymous »

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

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

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 я получаю сообщение об ошибке "

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

Argument types do not match
".
Однако странно, что изменение экземпляра внешнего объекта (

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

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#»