Использование хранимых процедур с Entity Framework 4 Code First CTP5 - PullRequest
10 голосов
/ 15 февраля 2011

Я использую Entity Framework 4 Code First CTP5 и ASP.NET MVC 3. Я хотел бы знать, как использовать хранимые процедуры?

У меня есть следующий код в моем классе репозитория:

MyDatabaseContext db = new MyDatabaseContext();

public void Insert(News news)
{
   db.Newses.Add(news);
   db.SaveChanges();
}

И тогда моя процедура хранения будет выглядеть следующим образом:

ALTER PROCEDURE [dbo].[News_Insert]
(
   @Title VARCHAR(100),
   @Body VARCHAR(MAX),
   @NewsStatusId INT
)

AS

BEGIN

   INSERT INTO
      News
      (
         Title,
         Body,
         NewsStatusId
      )
      VALUES
      (
         @Title,
         @Body,
         @NewsStatusId
      );

  SELECT SCOPE_IDENTITY();

END

Любые статьи / советы будут оценены.

ОБНОВЛЕНИЕ 1:

С дизайнером я мог бы вернуть новый объект или идентификатор новости, как бы я сделал это здесь?

ОБНОВЛЕНИЕ 2

Вот чтоЯ сделал:

public void Insert(News news)
{
   int newsId = context.Database.SqlQuery<int>("News_Insert @Title, @Body, @Active",
      new SqlParameter("Title", news.Title),
      new SqlParameter("Body", news.Body),
      new SqlParameter("Active", news.Active)
   ).FirstOrDefault();

   context.SaveChanges();
}

Я получаю здесь ошибку:

Указанное приведение от материализованного типа 'System.Decimal' к типу 'System.Int32' не являетсядействительный.

Мои новости класс:

public class News
{
   public int NewsId { get; set; }
   public string Title { get; set; }
   public string Body { get; set; }
   public bool Active { get; set; }
}

Я использую существующую базу данных, и моя строка подключения выглядит следующим образом:

<connectionStrings>
   <add
      name="MyDatabaseContext"
      connectionString="Data Source=MyServer;Initial Catalog=MyDatabase;Integrated Security=True;"
      providerName="System.Data.SqlClient" />
</connectionStrings>

Вот мойкласс контекста:

public class MyDatabaseContext : DbContext
{
   public DbSet<News> Newses { get; set; }
}

Я не уверен, что я здесь не так делаю?Может быть, моя хранимая процедура неверна?В идеале я хотел бы вернуть новый обновленный объект.Может кто-нибудь посоветовать, пожалуйста?

Ответы [ 2 ]

9 голосов
/ 15 февраля 2011

Отсутствует поддержка прямого отображения для хранимых процедур (как известно из EDMX).Вы можете просто вызвать свою процедуру вместо Add метода, используя db.Database.SqlCommand метод.Попробуйте это:

db.Database.SqlCommand("dbo.News_Insert @Title, @Body, @NewsStatusId",
  new SqlParameter("Title", news.Title),
  new SqlParameter("Body", news.Body),
  new SqlParameter("NewsStatusId", news.NewStatus.Id));
1 голос
/ 13 декабря 2012

вы можете написать хранимые процедуры в sql и обновить вашу сущность, а затем преобразовать ее в функцию и использовать ее, например, функцию в вашей программе, щелкнув db-кнопкой мыши на Entity Model и на открытой странице (EntityModel), затем я справа на странице db - нажмите на папку с именем StoredproceduresEntity и откройте, затем щелкните правой кнопкой мыши на a StoredProcedures и выберите опцию AddFunction..., затем выберите тип вывода идти к: http://msdn.microsoft.com/en-us/data/gg699321.aspx

...