Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架中的映射选择存储过程_C#_Asp.net_Entity Framework_Stored Procedures - Fatal编程技术网

C# 实体框架中的映射选择存储过程

C# 实体框架中的映射选择存储过程,c#,asp.net,entity-framework,stored-procedures,C#,Asp.net,Entity Framework,Stored Procedures,我的情景 我正在使用VisualStudio2010和EntityFramework4.1 我有一个包含许多表和许多存储过程的遗留数据库。 我正在用MVC3编写一个ASP.NETC程序 我采用了使用ADO.NET DbContext的“数据库优先”设计,因此我有一个edmx,其中所有的模型、关联和导航属性都设置得很好。 我可以将插入、更新、删除过程映射到相关模型。 我已经使用“函数导入”来导入其他存储过程。 但是,我找不到一种方法来映射我的选择过程,以选择操作按id选择、选择列表、按过滤器选择等

我的情景 我正在使用VisualStudio2010和EntityFramework4.1 我有一个包含许多表和许多存储过程的遗留数据库。 我正在用MVC3编写一个ASP.NETC程序

我采用了使用ADO.NET DbContext的“数据库优先”设计,因此我有一个edmx,其中所有的模型、关联和导航属性都设置得很好。 我可以将插入、更新、删除过程映射到相关模型。 我已经使用“函数导入”来导入其他存储过程。 但是,我找不到一种方法来映射我的选择过程,以选择操作按id选择、选择列表、按过滤器选择等

EF似乎使用延迟加载,因此我希望发生的是,当对象获取其子对象时,它使用已编写的存储过程。 select过程考虑到“IsDeleted”标志,并使用“ORDER BY”子句等

我从这篇文章中看到 LINQtoSQL允许拖放SP,这听起来或多或少正是我想要的

我还遇到了定义查询这个术语。 这就是我想要的吗?我不喜欢这样的注释:“运行更新模型向导时,对存储模型所做的任何更改(包括定义查询)都将被覆盖。”

总之,我希望发生的是,当一个对象获取其子对象时,它将使用我的存储过程

我可以使用实体框架实现我的目标吗? 我错过了什么明显的东西吗

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

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

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

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

除非您可以,某种程度上

采用最基本的select存储过程,即最接近select*from mytable的存储过程,并使用它在数据库中定义视图。让实体框架使用此myview而不是mytable。然后映射此基于视图的实体的插入、更新和删除存储过程,就像最初映射表一样

最后,将函数导入用于更具选择性的选择,并定义它们以返回实体的集合。因此,如果您有一个类似Person的实体,并且您有一个名为FetchPersonByAgeint的存储过程,那么您的实体最终将使用一个名为GetByAgeint的静态方法。然后,您可以这样在代码中调用它:var people33=Person.getByAge33

我已经完成了这项工作,并且工作得非常好,这使我能够尊重遗留数据库的设计者的要求,即所有数据库访问都必须通过其存储的进程,并且没有用户代码直接访问表。见朱莉·勒曼的文章:


戴夫

谢谢。这证实了我的怀疑