2014-01-26 4 views
0

Я хочу отображать информацию из пользовательской функции в ASP.NET MVC 4 Razor. Функция в базе данных выглядит следующим образом:Я не понимаю, почему мой класс отображается как сложный тип

CREATE FUNCTION dbo.udf_GetReportsByController(@controller_account VARCHAR(128)) 
RETURNS @retReports table (
    ID INTEGER IDENTITY PRIMARY KEY, 
    ProviderID VARCHAR(50) NOT NULL , 
    VertragID INTEGER NOT NULL, 
    Leistungszeitraum_von DATE NOT NULL, 
    Leistungszeitraum_bis DATE NOT NULL, 
    ReportklasseID VARCHAR(50) NOT NULL, 
    Version INTEGER NOT NULL, 
    Status VARCHAR(64) 
) 
AS 
BEGIN 
    //Do some stuff and insert in the ret-table 
     RETURN; 
END; 
GO 

Entity Framework отображается это в этом классе:

public partial class udf_GetReportsByController_Result 
{ 
    [Column("ID")]   
    public int ID { get; set; } 
    [Column("ProviderID")] 
    public string ProviderID { get; set; } 
    [Column("VertragID")] 
    public int VertragID { get; set; } 
    [Column("Leistungszeitraum_von")] 
    public System.DateTime Leistungszeitraum_von { get; set; } 
    [Column("Leistungszeitraum_bis")] 
    public System.DateTime Leistungszeitraum_bis { get; set; } 
    [Column("ReportklasseID")] 
    public string ReportklasseID { get; set; } 
    [Column("Version")] 
    public int Version { get; set; } 
    [Column("Status")] 
    public string Status { get; set; } 
} 

Когда я хочу сделать некоторую DbSet-методу в моем контроллере, я получаю сообщение об ошибке, что мой класс модели отображается как сложный тип. Я читал, что сложный тип не имеет первичного ключа, но я определил его в своей функции, и мне нужно обратиться к элементу с помощью его идентификатора. Как указать первичный ключ в этой таблице ret?

+0

Как класс подключен к вашему DbContext? –

+0

В моем контексте у меня есть атрибут'public DbSet reportSet {get; задавать; } ' и метод, который вызывает функцию базы данных и возвращает IQueryable . – TheDidi

ответ

0

Когда вы делаете что-то вроде

context.Set<udf_GetReportsByController_Result>() 

Entity Framework будет искать таблицу, которая отображается на тип результата. Однако эта таблица не существует. Функция возвращает таблицу, но это переменная таблицы, а не таблица, которая является частью схемы базы данных. Только типы объектов сопоставляются с таблицами схем.

Вы можете получить только udf_GetReportsByController_Result объектов, вызывая импортируемую функцию:

var results = context.udf_GetReportsByController(accountNo); 
+0

Спасибо за ваш ответ! Я уже знаю это, в моем контроллере я использую это для создания списка: 'result = db.udf_GetReportsByController (acc);' Но если вы нажмете на определенный элемент в таблице, я хочу получить этот конкретный элемент в моем контроллере , например: 'Report rep = result.Find (id)' или что-то, что вы можете сделать с обычными типами сущностей. Есть ли способ получить определенный элемент по его идентификатору? – TheDidi

+0

Вы можете получить результаты по этой функции, а затем применить дополнительные фильтры, если это необходимо. Не 'Найти '. Вы можете делать 'results.FirstOrDefault (...)', но 'Find' - сложная функция, основанная на' DbSet' и кэшированных сущностях, ни одна из которых не применяется к результатам функции. –

+0

Спасибо всем за ваши ответы! Я обработал проблему, как вы сказали мне, используя объект IQueryable. Я нахожу свой конкретный отчет, используя LINQ 'result.any (r => r.ID == id (параметр));' – TheDidi

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