使用存储过程与Entity Framework 4 Code First CTP5

Bre*_*ogt 10 sql-server entity-framework entity-framework-4

我正在使用Entity Framework 4 Code First CTP5和ASP.NET MVC 3.我想知道如何使用存储过程?

我的respository类中有以下代码:

MyDatabaseContext db = new MyDatabaseContext();

public void Insert(News news)
{
   db.Newses.Add(news);
   db.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)

然后我的插入存储过程将如下所示:

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
Run Code Online (Sandbox Code Playgroud)

任何文章/建议将不胜感激.

更新1:

有了设计师,我可以返回新对象或新闻ID,我该怎么做?

更新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();
}
Run Code Online (Sandbox Code Playgroud)

我在这里得到一个错误说:

从物化的"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; }
}
Run Code Online (Sandbox Code Playgroud)

我使用的是现有数据库,我的连接字符串如下所示:

<connectionStrings>
   <add
      name="MyDatabaseContext"
      connectionString="Data Source=MyServer;Initial Catalog=MyDatabase;Integrated Security=True;"
      providerName="System.Data.SqlClient" />
</connectionStrings>
Run Code Online (Sandbox Code Playgroud)

这是我的上下文类:

public class MyDatabaseContext : DbContext
{
   public DbSet<News> Newses { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我不确定我在这里做错了什么?我的存储过程可能不正确吗?理想情况下,我想返回新的更新对象.有人可以建议吗?

Lad*_*nka 9

存储过程没有直接映射支持(如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));
Run Code Online (Sandbox Code Playgroud)