2017-01-16 23 views
1

Я использую первый подход к базе данных Entity Framework DB. Когда я хочу, чтобы вытащить данные из БД я использую метод GetForm_AttachmentByAppID .Я получаю следующую ошибку во время выполнения, когда я называю этот метод из моего кода:Объект или сложный тип 'FPSDB_newModel.Form_Attachment' не может быть сконструирован в запросе LINQ to Entities

An exception of type 'System.NotSupportedException' occurred in  EntityFramework.SqlServer.dll but was not handled in user code 

Additional information: The entity or complex type 'FPSDB_newModel.Form_Attachment' cannot be constructed in a LINQ to Entities query. 

The photo showing the Entity Framework file

public partial class Form_Attachment 
{ 
public int Form_AttachmentID { get; set; } 
public Nullable<int> AttachmentCategoryID { get; set; } 
public int ApplicationID { get; set; } 
public string EmployeeID { get; set; } 
public string DocumentName { get; set; } 
public string DocumentSize { get; set; } 
public Nullable<byte> RoleID { get; set; } 
public string Description { get; set; } 
public Nullable<bool> SelectionForExtRev { get; set; } 

public virtual Application Application { get; set; } 
public virtual AttachmentCategory AttachmentCategory { get; set; } 
public virtual Employee Employee { get; set; } 
public virtual Role Role { get; set; } 
}  

Этот файл автогенерируется и код есть в FPSModel.cs, а внизу мой код для извлечения данных

public List<Form_Attachment> GetForm_AttachmentByAppID(int applicationID) 
{ 
    var context = new FPSDB_newEntities(); 
    var data = (from f in context.Form_Attachment 
       where 
       (
       f.ApplicationID== applicationID 
       ) 
       select new Form_Attachment 
       { 
        Form_AttachmentID = f.Form_AttachmentID, 
        AttachmentCategoryID = f.AttachmentCategoryID, 
        EmployeeID = f.EmployeeID, 
        ApplicationID = f.ApplicationID, 
        DocumentName = f.DocumentName, 
        DocumentSize = f.DocumentSize, 
        RoleID = f.RoleID, 
        Description = f.Description, 
        SelectionForExtRev = f.SelectionForExtRev 
       }).ToList(); 
    return data; 
} 

Также здесь является определение БД моего стола Form_Attachments

CREATE TABLE [dbo].[Form_Attachment](
[Form_AttachmentID] [int] IDENTITY(1,1) NOT NULL, 
[AttachmentCategoryID] [int] NULL, 
[ApplicationID] [int] NOT NULL, 
[EmployeeID] [varchar](10) NOT NULL, 
[DocumentName] [nvarchar](500) NULL, 
[DocumentSize] [nvarchar](50) NULL, 
[RoleID] [tinyint] NULL, 
[Description] [ntext] NULL, 
[SelectionForExtRev] [bit] NULL, 
CONSTRAINT [PK_Form_AttachmentID] PRIMARY KEY CLUSTERED 
(
[Form_AttachmentID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,  ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 

Я прочитал это The Projection should not be on to a mapped entity Так что, если я сделать класс Form_Attachments1 так же, как автоматически сгенерированных Form_Attachments так будет это объект передачи данных DTO, и это правильный подход.

ответ

1

Вы можете попробовать это:

public List<Form_Attachment> GetForm_AttachmentByAppID(int applicationID) 
{ 
    var context = new FPSDB_newEntities(); 
    var data = (from f in context.Form_Attachment 
       where 
       (
       f.ApplicationID== applicationID 
       ) 
       select f).ToList(); 
    return data; 
} 

или это:

data = context.Form_Attachment.Where(p => p.ApplicationID == applicationID).ToList(); 

я не могу проверить это сейчас, но это должно работать. Вам не нужно отображать, потому что «f» уже означает ваш класс сущности Form_Attachment. Если вы использовали класс DTO, например «Form_AttachmentDto», вам нужно было бы его сопоставить следующим образом:

public List<Form_AttachmentDto> GetForm_AttachmentByAppID(int applicationID) 
    { 
     var context = new FPSDB_newEntities(); 
     var data = (from f in context.Form_Attachment 
        where 
        (
        f.ApplicationID== applicationID 
        ) 
        select f).Select(p=>new Form_AttachmentDto() 
         { 
         //... 
         // here comes the mapping code 
         //.. 
         } 
        ).ToList(); 
     return data; 
    } 
+0

Идеальное решение! Спасибо Дорогой – shomaail

+0

Я рад, что помог. –

+0

Для вашего другого вопроса, который я только что заметил, использование классов DTO - лучший подход. Я всегда использую классы DTO как средний уровень (бизнес-уровень) между уровнем доступа к данным и уровнем представления. Этот подход дает мне гибкость при вмешательстве в такие данные, как проверка, регистрация или авторизация и т. Д. Конечно, есть намного больше преимуществ, я не могу написать их здесь. Хорошие кодировки :) –

 Смежные вопросы

  • Нет связанных вопросов^_^