具有关系的实体框架自定义过程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了具有关系的实体框架自定义过程相关的知识,希望对你有一定的参考价值。

我有一个名为MenuContainer的类

public partial class MenuContainer : IEquatable <MenuContainer>
{
    [Column("Id ")]
    [Key]
    public int Id { get; set; }

    public int MenuId { get; set; }

    public int WareId { get; set; }

    public int Price { get; set; }

    public virtual Menu Menu { get; set; }

    public virtual Ware Ware { get; set; }

    public bool Equals(MenuContainer other)
    {
        return (this.Id == other.Id && this.MenuId == other.MenuId && this.WareId == other.WareId);
    }
}

它与菜单有关系(每个菜单都有多菜单容器)。现在,当我想加载带有关系的MenuContainer时,我可以使用Include()。喜欢:

context.MenuContainers.Include("Menu").Include("Ware.WareCategory").Include("Ware.WareDescriptions.Description");

但我的问题是实体框架为此生成了长脚本(大约2000行代码的脚本和嵌套的选择和连接)所以我决定写这样的自定义程序:(不是我想要的只是简单的一个)

SELECT 
mc.MENU_CONTAINER_ID AS Id,
mc.MENU_ID AS MenuId ,
mc.WARE_ID AS WareId,
mc.WARE_PRICE_IN AS  Price,
mc.WARE_PRICE2_IN AS Price2,
m.MENU_NAME_VC AS Name,
m.MENU_DESCRIPTION_VC AS [Description]

FROM dbo.MENU_CONTAINER mc 
INNER JOIN dbo.MENU m ON m.MENU_ID = mc.MENU_ID

但是如何将我的脚本输出转换为MenuContainer类?

(你知道我应该用这个脚本的输出创建MenuContainer及其关系“Menu”)

我不想声明类,与我的脚本的输出相同,并使用类似的

            return this.Database.SqlQuery<CustomClass>(
            "exec dbo.CustomeProcedure").ToList();

并填充CustomClass然后执行很多foreach和groupby和...以生成我的MenuContainer类及其关系类

我该怎么办? EF如何处理这个问题?

答案

最后我发现,如果我想编写自定义过程,我应该有一个与输出相同的类,所以我创建一个类并用我自己的自定义过程填充它:

this.Database.SqlQuery<CustomClass>("exec dbo.CustomeProcedure").ToList();

但在我提到的这种情况下,我必须执行foreach和....来提取我的类及其属性(如另一个实体的列表)。写入需要时间,但执行时间显着改善。在之前的情况下,当我使用EF include()时,它需要大约2000毫秒,但现在需要大约300毫秒的所有foreach和转换我已经完成...

我认为EF在其中一个层面上做同样的事情(我的意思是将sp转换为类)。

以上是关于具有关系的实体框架自定义过程的主要内容,如果未能解决你的问题,请参考以下文章

使用自定义 ID 插入数据的 Code-First 实体框架

多对多(自相关)特定订单实体框架

实体框架 - 您能否将导入的存储过程的结果类型映射到自定义实体类型?

使用带有 OData 提要 C# 的存储过程的自定义分页,没有实体框架

实体框架代码优先关系 - 如何定义两个对象之间的关系:两个实体之间的可选一对一

使用默认成员关系的 MVC3 实体框架