0

У меня есть модель, которая сопоставляется с базой данных через EF7. Все свойства идентичны отображаемым столбцам таблицы.Entity Framework 7 Сохраненная процедура Результат для модели

Теперь у меня есть хранимая процедура, которая возвращает некоторые вложенные столбцы, но основой по-прежнему является отображаемая модель.

Это моя модель (Entity), которая сопоставлена ​​с Table1 в моей базе данных.

public partial class Table1 { public int id { get; set; } public bool Column1{ get; set; } public int Column2 { get; set; } public int Column3 { get; set; } public int Column4 { get; set; } public int Column5 { get; set; } }

Мой StoredProcedure возвращает все эти столбцы и дополнительно столбца из другой таблицы, которая содержит дополнительную информацию об этом объекте.

Так мой StoredProcedure выглядит следующим образом:

CREATE PROCEDURE Table1_Select 
    AS 
     BEGIN 
      SELECT Column1, 
        Column2, 
        Column3, 
        Column4, 
        Column5, 
        Table2.JoinedColumn1 
      FROM Table1 
      JOIN Table2 on Table1.ID = Table2.ID_Table1 
     END 

Моя идея в том, чтобы просто добавить свойства в модели

public string JoinedColumn1 {get; set;} 

Это работает для выполнения StoredProcedure, но он не работает, как только поскольку я хочу получить одну организацию с

MyContext.Table1.FirstOrDefault(t=>t.id == 1) 

это всегда возвращает сервер Ошибка 500 в Fiddler, тогда как выполнение хранимой процедуры с «Table1.FromSql (« Table1Select ») работает нормально.

Или мне нужно решить, следует ли использовать StoredProcedures для моей модели или доступа к объектам напрямую?

Любые лучшие практики или решения для этого?

Большое спасибо заранее. Nicn

+0

Почему не процедуры магазина, включенных в которой проект с использованием Entity Framework Database First подход? –

+0

Как добавить StoredProcedures в команду Scaffold? Я только нашел [эту ссылку] (https://github.com/aspnet/EntityFramework/wiki/Design-Meeting-Notes- (октябрь-1, -2015) # table-selection-in-reverse-engineering), которая гласит: t для таблиц или -s для схем ... – nicn

ответ

0

попробовать этот способ,

var results = db.Database.SqlQuery<YourModel>("exec YourSPName [Optional Parameters]").ToList(); 
+0

'return context.Table1.FromSql' отлично работает, когда я добавляю объединенный столбец как свойство, однако' context.Table1.ToList() 'больше не работает. – nicn

+0

Можете ли вы предоставить код? –

+0

Модель: 'public partial class Table1 { public int id {get; задавать; } public bool Column1 {get; задавать; } public int Column2 {get; задавать; } public int Column3 {get; задавать; } public int Column4 {get; задавать; } public int Column5 {get; задавать; } public string JoinColumn1 {get; задавать; } } ' Рабочая команда: ' StringBuilder sql = new StringBuilder(); sql.Append («EXEC Table1_Select»); вернуть Table1.FromSql (sql.ToString()) ToList(); ' Не работает команда:. ' вернуть context.Table1.ToList(); ' или же вам нужны файлы? – nicn

0

Я прочитал из источника в виде использования раствора образца ADO.NET Подключение.

Параметры образца

try 
{ 
      SqlDataAdapter adapt = new SqlDataAdapter("Table1_Select", ConnectionString); 
      adapt.SelectCommand.Parameters.AddWithValue("@yourparameters", param); 

      adapt.SelectCommand.CommandType = CommandType.StoredProcedure; 
      DataTable dt = new DataTable(); 
      adapt.Fill(dt); 
      adapt.Dispose(); 
      adapt = null; 

      return dt; 
} 
catch(Exception ex) 
{ 
throw ex 
} 

ли не изменяемые параметры пробы;

try 
{ 
    SqlDataAdapter adapt = new SqlDataAdapter("Table1_Select", ConnectionString); 
    adapt.SelectCommand.CommandType = CommandType.StoredProcedure; 
    DataTable dt = new DataTable(); 
    adapt.Fill(dt); 
    adapt.Dispose(); 
    adapt = null; 

    return dt; 
} 
catch (Exception ex) 
{ 
    throw ex; 
} 

Вы получаете табличные столбцы, заданные для данных, и читаете данные. Табличные значения и устанавливаете значения данных класса.

Читать DataTable Пример:

DataTable dt = YourGetDataTableFunction(val); 
    DataRow dr = dt.Rows[0]; //index is zero 
string Column1 = dr["column1"].ToString(); 
string Column2 =dr["column2"].ToString(); 

Я надеюсь, что это помогает.

Другой Вопрос: How to run stored procedures in Entity Framework Core?

0

вопрос не то, что я не могу получить данные из StoredProcedure. Проблема в том, что из-за хранимой процедуры моя модель имеет больше свойств, чем столбцы в таблице базы данных. Однако мне все же хотелось бы получить доступ к объектам модели иногда напрямую, не используя хранимую процедуру, которая не работает, поскольку отладчик говорит «недопустимый столбец» для столбца, который находится не в таблице, а в хранимой процедуре.

Надеюсь, что это станет более понятным.

Еще раз спасибо.

Nicn

0

С Вашего недавнего поста, вы сказали, что вы используете ту же модель и получить ошибку, поэтому я хотел бы предложить, что использование [NOTMAPPED] до вашего pertcular объявил объект позволяет сказать,

public int Column5 { get; set; } , который используется только в то время как вы вызываете ваш SP, так писать, как,

[NotMapped] 
public int Column5 { get; set; } 
+0

Это работает для сущностей, но '.FromSql (« exec SP_Name »)' не возвращает этот столбец сейчас. Должен ли я использовать способ Akin для storedProcedures, чтобы получить значение этого столбца? – nicn

+0

Вы пробовали это? это может сработать для вас. var results = db.Database.SqlQuery ("exec YourSPName [Дополнительные параметры]"). ToList(); –

+0

Кажется, что в 7.0.0-rc1-final FromSql заменил SqlQuery и должен быть против DbSet. Мы увидим в команде, в какую сторону мы пойдем и какие случаи могут появиться в нашем проекте. Большое спасибо за ваши усилия в этом. – nicn

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