【问题标题】:Some questions about the .NET Entity Framework and Stored Procedures关于 .NET Entity Framework 和存储过程的一些问题
【发布时间】:2010-05-26 22:10:43
【问题描述】:

大家好,我有几个关于 .NET Entity Framework 和使用存储过程的问题。如下:

  1. 我知道我们可以右键单击存储过程并选择函数导入以便能够与代码一起使用。有没有办法同时为多个存储过程执行此操作?

  2. 在执行函数导入时,我可以创建新的 Complex 类型或使用现有的 Complex 类型。那么,如何访问 edmx 文件之外的复杂类型/对象?也就是说,如果我的项目中有一个类,是否可以在进行函数导入时访问它?

  3. 从代码调用存储过程时,它返回一个复杂类型的 IEnumerable,我将其设置为。但是,有时这些复杂类型并不具备我需要的所有属性,因此我在项目中创建了一个新类,该类继承自存储过程中使用的复杂类型。问题是,我似乎无法将从存储过程返回的复杂类型转换为我创建的新类。为什么我不能这样做?我最终做的是遍历 IEnumerable 并将每个项目添加到我创建的类的新列表中。但这感觉和看起来很乱。

巴拉

【问题讨论】:

    标签: .net entity-framework stored-procedures complextype


    【解决方案1】:
    1. 也许我理解错了,但在你的模型中你可以right-click > Update Model from Database。在Add 选项卡中,只需选择要添加到模型中的所有存储过程。

    2. 据我所知没有。 Entity Framework 的重点是避免手动创建实体(代码生成)。您可以先创建数据库并复制到模型,也可以先创建模型并生成数据库表。无论哪种方式,实际的 .NET 实体都是自动生成的。如果您稍后更改模型,则会重新生成实体。如果您可以导入自己的预先存在的实体,那么当您的模型更改时,您将面临被覆盖的风险。它们也将不在模型的控制范围内(如果它们位于单独的组件中,如何处理等?)。使用部分实体(更多关于 #3 的内容),您可以扩展生成的类,而不会冒您的自定义被覆盖的风险。您仍然可以将现有的类用作 DTOs,但是您必须手动将 EF 生成的实体转换为 DTO 对象。

    3. 您不能将基类强制转换为派生类。见:A way of casting a base type to a derived type

    我不确定 .NET 3.5 (EF 1),但 .NET 4 (EF 2) 中的实体/复杂类型是部分类。这意味着您可以简单地通过扩展类来添加成员。例如,如果您的自定义类型是:

    public partial class Address
    {
      public string Address1 { get; set; }
      public string Address2 { get; set; }
      public string City { get; set; }
      public string State { get; set; }
      public string Zip { get; set; }
    }
    

    您可以使用以下命令创建一个新文件:

    public partial class Address
    {
      public string MyProperty { get; set;}
    }
    

    然后执行new Address { Address1 = "abc", MyProperty = "def" };。它们都必须在同一个程序集和同一个命名空间中。

    【讨论】:

    • 1.添加存储过程后,您仍然需要访问每个存储过程并执行函数导入。现在我必须单独执行此操作,并且对于数百个存储过程,这可能会失控。 2. 我明白了,很公平。不过,您对第 3 点的回答对此有很大帮助,所以谢谢。 3. 这并不能完全回答我的问题,但它有很大的帮助。我确定我可以更改我的代码来使用它。感谢所有帮助:)
    • 我正在尝试使用部分类,从编码的角度来看,它都可以正常工作。但是,我将类列表作为 XML(使用 REST 服务)返回,并且它缺少我的部分类中的参数(例如:您的示例中的 MyProperty)。有什么原因吗?
    • 显然,在我的属性上方添加它可以修复它: [global::System.Runtime.Serialization.DataMemberAttribute()] ...例如,在您的示例中,它会在 public string MyProperty { get ;放; }
    • @Bara: 1. 我在 EF 中使用存储过程的次数不多,所以对此我不是很熟悉。我唯一能想到的就是将模型修改为 XML(在 VS 中,右键单击,打开方式...,XML 编辑器)。您可以直接编辑,使用搜索/替换,甚至编写外部脚本来修改它。但我不知道有什么内置的。
    • @Bara: 3. “我似乎无法将从存储过程返回的复杂类型转换为我创建的新类[继承自复杂类型]”。返回的复杂类型将是基类;你的类是派生类。该链接解释了为什么不能将基类转换为派生类......除非我仍然误解。不管怎样,看起来我至少让你朝着正确的方向前进。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    相关资源
    最近更新 更多