如何使用实体框架将存储过程的结果映射到具有不同命名参数的实体

2024-03-29

我正在尝试使用实体框架创建一个基本示例,以将 SQL Server 存储过程的输出映射到 C# 中的实体,但该实体具有不同(友好)的名称参数,而不是更神秘的名称。我还尝试使用 Fluent(即非 edmx)语法来做到这一点。


什么有效....

存储过程返回名为:UT_ID、UT_LONG_NM、UT_STR_AD、UT_CITY_AD、UT_ST_AD、UT_ZIP_CD_AD、UT_CT 的值

如果我创建一个像这样的对象......

public class DBUnitEntity
{
    public Int16 UT_ID { get; set; }
    public string UT_LONG_NM { get; set; }
    public string UT_STR_AD { get; set; }
    public string UT_CITY_AD { get; set; }
    public string UT_ST_AD { get; set; }
    public Int32 UT_ZIP_CD_AD { get; set; }
    public string UT_CT { get; set; } 
}

和这样的 EntityTypeConfiguration ...

public class DbUnitMapping: EntityTypeConfiguration<DBUnitEntity>
{
        public DbUnitMapping()
        {
            HasKey(t => t.UT_ID);
        }
}

...我将其添加到 DbContext 的 OnModelCreating 中,然后我可以从数据库中很好地获取实体,这很好,使用这个 ....

var allUnits = _context.Database.SqlQuery<DBUnitEntity>(StoredProcedureHelper.GetAllUnitsProc);

但是,什么不起作用

如果我想要一个像这样的实体,具有更友好的名称......

public class UnitEntity : IUnit
{
    public Int16 UnitId { get; set; }
    public string Name { get; set; }
    public string Address { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public Int32 Zip { get; set; }
    public string Category { get; set; }
}

和这样的 EntityTypeConfiguration ...

    public UnitMapping()
    {
        HasKey(t => t.UnitId);

        Property(t => t.UnitId).HasColumnName("UT_ID");
        Property(t => t.Name).HasColumnName("UT_LONG_NM");
        Property(t => t.Address).HasColumnName("UT_STR_AD");
        Property(t => t.City).HasColumnName("UT_CITY_AD");
        Property(t => t.State).HasColumnName("UT_ST_AD");
        Property(t => t.Zip).HasColumnName("UT_ZIP_CD_AD");
        Property(t => t.Category).HasColumnName("UT_CT");
    }

当我尝试获取数据时,我收到 System.Data.EntityCommandExecutionException 消息...

“数据读取器与指定的‘DataAccess.EFCodeFirstSample.UnitEntity’不兼容。类型的成员‘UnitId’在数据读取器中没有同名的对应列。”

如果我将“存储过程命名”属性添加到实体,它会抱怨下一个“未知”属性。

在这种代码优先的存储过程流畅风格的 EF 中,“HasColumnName”是否无法按照我的预期/希望的方式工作?


Update:

尝试使用 DataAnnotations(来自 ComponentModel 的键和来自 EntityFramework 的列)...ala

public class UnitEntity : IUnit
{
    [Key]
    [Column("UT_ID")]
    public Int16 UnitId { get; set; }
    public string Name { get; set; }

这确实消除了对具有数据库相同命名的 DBUnitEntity 的任何 EntityTypeConfiguration 的需要(即仅添加 [Key] 属性),但对于属性名称与数据库不匹配的实体没有任何作用(相同的错误)像之前一样)。

我不介意在模型中使用 ComponentModel 注释,但如果可以的话,我真的不想在模型中使用 EntityFramework 注释(不想将模型绑定到任何特定的数据访问框架)


From 实体框架代码优先 https://rads.stackoverflow.com/amzn/click/com/1449312942书(第155页):

SQLQuery 方法始终尝试根据属性名称进行列到属性匹配... 没有,列到属性名称匹配不考虑任何映射。例如,如果您已将 DestinationId 属性映射到 Destination 表中名为 Id 的列,则 SqlQuery 方法将不会使用此映射。

因此,在调用存储过程时不能使用映射。一种解决方法是修改存储过程以返回结果,其中每列的别名将与对象属性的名称相匹配。

Select UT_STR_AD as Address From SomeTable etc

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用实体框架将存储过程的结果映射到具有不同命名参数的实体 的相关文章

随机推荐

  • 自定义 Perforce RCS 关键字扩展的输出

    我想使用 RCS 关键字扩展来过滤文件 以便 Change 被翻译成1745而不是默认行为 Change 1745 我意识到这会阻止未来的扩展 但就目的而言这是可以接受的 也欢迎使用其他将更改列表编号插入文件的方法 这是我在 Perforc
  • 列表视图多重选择

    有没有办法强制列表视图控件将所有点击视为通过 Control 键完成的 我需要复制使用控制键的功能 选择项目集并取消设置其选择状态 以便允许用户轻松地同时选择多个项目 先感谢您 即使 MultiSelect 设置为 true 这也不是 Li
  • 逐字迭代字符串

    我想知道如何逐字迭代字符串 string this is a string for word in string print word 上面给出了一个输出 t h i s i s a s t r i n g 但我正在寻找以下输出 this
  • 反射值接口和指针接收器

    在golang的mongodb驱动中有以下代码 case reflect Struct if z ok v Interface Zeroer ok return z IsZero return false Zeroer 接口定义如下 typ
  • 比较 (int)double 和 (int)int 时出现异常

    嘿 我正在使用 pdCurses lib 和 stringStream 来计算并制作一个代表时钟的 5 个字符长的字符串 它显示为 00 00 0 00 00 00 或 0 000 但是 当运行我的函数时 我在这部分抛出一个异常 if in
  • 如何在Python中验证字典的结构(或模式)?

    我有一本包含配置信息的字典 my conf version 1 info conf one 2 5 conf two foo conf three False optional conf bar 我想检查字典是否遵循我需要的结构 我正在寻找
  • 有没有办法给某人打电话并在android中播放音频文件?

    我想创建一个紧急呼叫应用程序 如果触发 它会呼叫给定号码并播放音频文件 提供呼叫者无法提供的信息 为此 我需要拨打电话 但确保我可以用播放的音频文件替换扬声器中的任何声音 我可以在安卓中做到这一点吗 有什么办法呢 目前您无法使用 G1 执行
  • 自定义“AuthenticationStateProvider”身份验证失败

    我创建了一个自定义ApiAuthenticationStateProvider返回后AuthenticationState仍在说明 info Microsoft AspNetCore Authorization DefaultAuthori
  • Genymotion 中运行的虚拟设备会定期在 ADB 中离线

    我有一个在 Genymotion 2 4 中运行的 Android 设备 如果重要的话 带有 Lollipop 图像 并通过 ADB 版本 1 0 32 从本地网络中使用 Eclipse 的另一台开发人员 PC 连接到它 没有连接问题 一切
  • 如何使用 swift 3 通过 firebase 推送通知发送图像

    任何人都可以帮我发送这样的通知 我正在使用 Firebase 通知 当我发送通知时 我尝试将图像 URL 放入高级选项和键 1 的值中 图像 URL 显示在调试器中 但当我的设备中出现通知时 没有显示图像 这是我的代码 import UIK
  • 使用 Moq 进行 FormsAuthentication.SetAuthCookie 模拟

    您好 我正在对 ASP Net MVC2 项目进行一些单元测试 我正在使用起订量框架 在我的 LogOnController 中 HttpPost public ActionResult LogOn LogOnModel model str
  • SBT 未解决 Squeryl 依赖关系

    我最近开始了一个新项目 Play 框架和Scala 我习惯于使用 Squeryl 进行 ORM 但由于某种原因 这次它无法解决我的依赖关系 尽管它会解决其他问题 只是不能解决 squeryl 问题 我所做的唯一不同的是 我使用的计算机与以前
  • 是否可以查询ExpandoObject列表?

    我想知道是否可以使用常规 LINQ 查询 ExpandoObject 原因是我有动态 ExpandoObject 但我需要进行一些查询才能进一步传递 它有一些始终保留的属性 例如Id Notes还有一些我无法控制的动态属性 这是我的列表的样
  • 在 PowerPoint 中插入、裁剪和调整图像大小,每张现有幻灯片一张

    这是我创建的用于插入图像和调整图像大小的代码 每张幻灯片一个 我无法裁剪从文件位置插入的图像 过程应该是 将图像从文件位置插入到现有幻灯片中 将图像裁剪为所需的尺寸 将图像调整为所需的大小 注意 我的一个文件中有大约 40 张图像 我需要将
  • 什么是依赖类型?

    有人可以向我解释依赖类型吗 我对 Haskell Cayenne Epigram 或其他函数式语言缺乏经验 因此您可以使用的术语越简单 我就越感激 考虑一下 在所有像样的编程语言中 您都可以编写函数 例如 def f arg result
  • 在 Rails 查询中提取关联模型的属性

    在我的 Rails 应用程序中 收藏品有很多projects 并且项目有很多steps 我想获取集合项目中步骤的所有 id 我想知道是否可以在一个查询中完成这一切 例如 我知道我可以执行以下操作 step ids collection pr
  • Meteor 构建内存不足

    我正在尝试构建我的流星应用程序 并且不断遇到以下错误 这不是我第一次构建该应用程序 直到昨天的构建为止一切正常 我已经尝试过 正如 this SO post 1 中的一个答案中所建议的 但它没有帮助 usr bin env node max
  • SAPUI5:如何过滤具有2个或更多值的数据

    我目前正在 SAPUI5 中尝试一些东西 并且我已经实现了一个非常简单的搜索 如下所示 var filters var query evt getParameter query if query query length gt 0 var
  • Android:从服务中关闭屏幕

    我正在尝试找出如何从服务中关闭屏幕 我已经读过this https stackoverflow com questions 1875669 calling hidden api in android to turn screen off但我
  • 如何使用实体框架将存储过程的结果映射到具有不同命名参数的实体

    我正在尝试使用实体框架创建一个基本示例 以将 SQL Server 存储过程的输出映射到 C 中的实体 但该实体具有不同 友好 的名称参数 而不是更神秘的名称 我还尝试使用 Fluent 即非 edmx 语法来做到这一点 什么有效 存储过程