在实体框架中映射选择存储过程

时间:2011-10-31 12:42:58

标签: c# asp.net entity-framework stored-procedures

我的情景 我正在使用带有Entity Framework 4.1的Visual Studio 2010 我有一个遗留数据库,包含许多表和许多存储过程。 我正在使用MVC 3编写ASP.NET C#程序

我使用ADO.NET DbContext采用了'数据库优先'设计,因此我有一个edmx,其中包含所有模型和关联以及导航属性。 我可以将插入,更新,删除程序映射到相关模型。 我使用'Function Import'导入其他存储过程。 但是,我找不到一种方法来映射我的选择程序来选择动作(按id选择,选择列表,按过滤器选择等)。

EF似乎使用延迟加载,所以我想要发生的是当一个对象获取其子对象时,它使用已经编写的存储过程。 (选择过程考虑了'IsDeleted'标志,并使用'ORDER BY'条款等等)

我从这篇文章中看到 http://weblogs.asp.net/scottgu/archive/2007/08/16/linq-to-sql-part-6-retrieving-data-using-stored-procedures.aspx Linq to SQL允许拖放SP,听起来或多或少,正是我想要的。

我也遇到过“定义查询”一词。 http://msdn.microsoft.com/en-us/library/cc982038.aspx 这是我想要的吗?我不喜欢这样的说明'当您运行更新模型向导时,对存储模型所做的任何更改(包括定义查询)都将被覆盖。

总之,我想要发生的是当一个对象获取它的子对象时它使用我的存储过程。

我可以使用Entity Framework实现目标吗? 我错过了一些明显的东西吗?

或者我应该尝试变得非常聪明并修改db Entity T4模板,例如,我生成的Address模型具有以下属性:

public virtual ICollection<AddressLine> AddressLines { 
    get{
        DBWrapper _db = new DBWrapper();
        return _db.GetAddressLines(AddressID);
    } 
    set{}; 
}

其中GetAddressLines是调用函数导入的自定义函数,并执行必要的转换。

2 个答案:

答案 0 :(得分:6)

这是不可能的。您可以将存储过程作为函数导入导入并手动执行它们,但不能用自定义存储过程替换EF生成的查询。

答案 1 :(得分:2)

除了你可以之外,还有。

选择最基本的选择存储过程(即最接近“select * from mytable”的过程),并使用它来定义数据库中的视图。实体框架使用此“myview”而不是“mytable”然后映射您的插入,更新和删除此基于视图的实体的存储过程,就像您最初为表所做的那样。

最后,使用函数导入进行更具选择性的选择,并定义它们以返回实体的集合。因此,如果您有类似Person实体的东西,并且您有一个名为FetchPersonByAge(int)的存储过程,那么您的实体最终会得到一个名为“GetByAge(int)”的静态方法。然后你可以用这样的代码调用它:var people33 = Person.getByAge(33);

我已经完成了这项工作,并且它工作得很好,让我尊重遗留数据库的设计者要求所有数据库访问都通过他们的存储过程,并且没有用户代码直接访问表。见Julie Lerman的文章:

http://msdn.microsoft.com/en-us/data/gg699321.aspx

戴夫