Как преобразовать коллекцию одного типа класса в коллекцию другого типа класса в Entity Framework



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



Я работаю с кодом первый подход вот мой доменный класс



   public class Employee
{

[Key]
public int BusinessEntityId { get; set; }


[Required]
[MaxLength(50)]

public string JobTitle { get; set; }

[Required]
[DataType(DataType.DateTime)]
public DateTime BirthDate { get; set; }


[Required]
[MaxLength(1)]
public string MaritalStatus { get; set; }

[Required]
[MaxLength(1)]
public string Gender { get; set; }

[Required]
[DataType(DataType.DateTime)]
public DateTime HireDate { get; set; }

[Required]
public Boolean SalariedFlag { get; set; }

public ICollection<EmployeePayHistory> PayHistories { get; set; }

}


Вот мой класс объекта передачи данных(DTO)



 public class EmployeePayHistoryListDTO
{

public int Id { get; set; }

public DateTime RateChangeDate { get; set; }

public Decimal Rate { get; set; }

public Int16 PayFrequency { get; set; }

public String JobTitle { get; set; }

public String Gendre { get; set; }

}


Теперь, когда PayHistories является коллекцией в моем доменном классе I, я создаю новый класс
из которых имеет коллекцию моего класса DTO типа EmployeePayHistoryListDTO



 public class EmployeeRelatedCollections
{
public ICollection<EmployeePayHistoryListDTO> PayHistories { get; set; }
}


Итак, из моего репозитория я получаю данные правильно через следующее утверждение EF



 _context.Employees.Include("PayHistories")
.Include("PayHistories")
.Single(e=>e.BusinessEntityId==id);


Но там, где я преобразую коллекцию моего класса Employee (класс домена) в коллекцию моего типа DTO, я получаю ошибку, вот код



PayHistories = (from ph in employee.PayHistories
select new EmployeePayHistoryListDTO
{
Id = ph.BusinessEntityId,
RateChangeDate = ph.RateChangeDate,
Rate = ph.Rate,
PayFrequency = ph.PayFrequency,
JobTitle = ph.Employee.JobTitle,
Gendre = ph.Employee.Gender
}).ToList();


I am getting following exception below is summary


Исключением становится



 System.NullReferenceException ,  
Additional Information: Object reference Not set to an instance of an object.

Troubleshooting tips
1. Check to determine if the object is null before calling the method,
2. Use new keyword to create an object instance.
528   4  

4 ответов:

Откуда:

PayHistories = (from ph in employee.PayHistories
                        select new EmployeePayHistoryListDTO
                        {
                            Id = ph.BusinessEntityId,
                            RateChangeDate = ph.RateChangeDate,
                            Rate = ph.Rate,
                            PayFrequency = ph.PayFrequency,
                            JobTitle = ph.Employee.JobTitle,
                            Gendre = ph.Employee.Gender
                        }).ToList();

Можете ли вы сделать это:

PayHistories = (from ph in employee.PayHistories
                        select new EmployeePayHistoryListDTO
                        {
                            Id = ph.BusinessEntityId,
                            RateChangeDate = ph.RateChangeDate,
                            Rate = ph.Rate,
                            PayFrequency = ph.PayFrequency

                        }).ToList();

И посмотреть, если исключение все еще происходит?

Похоже, что на основе этого запроса у вас будет:

Employee -> PaymentHistory -> Employee.

В вашем заявлении:

_context.Employees.Include("PayHistories")
                                 .Include("PayHistories")                                 
                                 .Single(e=>e.BusinessEntityId==id);

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

.Include(i => i.PayHistories)

Надеюсь, это поможет ты!

Похоже, вам не удалось инициализировать объект employee. При возникновении исключения null reference вы должны иметь возможность проверить значение объекта employee, наведя на него курсор мыши, и увидеть, что оно равно null. Исключение nullreference возникает при попытке получить доступ к полю в объекте null (в данном случае к истории платежей).

Смотрите, если этот код избегает исключения:

if(employee!=null){
    if(employee.PayHistories.Any()){

        PayHistories = (from ph in employee.PayHistories
                        select new EmployeePayHistoryListDTO
                        {
                            Id = ph.BusinessEntityId,
                            RateChangeDate = ph.RateChangeDate,
                            Rate = ph.Rate,
                            PayFrequency = ph.PayFrequency,
                            JobTitle = ph.Employee.JobTitle,
                            Gendre = ph.Employee.Gender
                        }).ToList();
    }
}

Убедитесь, что сотрудник.PayHistories не содержит нулевых записей, или проверьте его внутри запроса:

PayHistories = (from ph in employee.PayHistories where null != ph
etc. . .

Кроме того, вы ссылаетесь на возможно лениво загруженное / неинициализированное свойство на "pH" (Employee), которое также может быть null.

Вот как мне решить мою проблему.У меня было несколько ссылок, которые не загружались должным образом.

Существовало два подхода

Подход 1.

Перегрузка метода расширения Include, которая принимает Expression<Func<T,U>>

_context.Employees.Include("PayHistories.furtherreferencename").Include("PayHistories.furtherReference");

Подход 2.

Используйте строго типизированный метод Include.

_context.Employees.Include(i=>i.PayHistories.select(e=>e.FurtherReference)).Include(i=>i.PayHistories.select(e=>e.FurtherReference));

Comments

    Ничего не найдено.