- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 EF Core 3.0 将数据从 SQL Server 存储过程提取到名为 Recipient
的对象模型中。 Recipient
模型定义了几个属性,EnvelopeId
和 Name
,它们不是从存储过程返回的。当我使用 FromSqlInterpolated
调用存储过程时,我收到错误消息
The required column 'EnvelopeId1' was not present in the results of a 'FromSql' operation
根据我在 EF Core 文档中阅读的内容,我应该能够向这些属性添加 [NotMapped]
属性,并且 EF Core 应该能够在读取或写入时忽略它们数据库对吧?不幸的是,这对我不起作用,我收到了上述错误。
如果我在存储过程中添加两列并删除对象模型中的 [NotMapped]
属性,一切正常。这证明我的其他列/属性名称正确匹配并且没有任何拼写错误。
我看到了使用 DbQuery
而不是 DbSet
的建议,但它已被弃用,所以我不想使用它。我看到了使用两种不同对象模型的建议,其中一种具有与存储过程结果集完全匹配的属性,但这只会导致大量额外的模型。我在这里做错了什么?
我的对象模型:
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace MyNamespace.Models
{
public class Recipient
{
[Key]
public long RecipientId { get; set; }
[NotMapped]
public Guid? EnvelopeId { get; set; }
public string Type { get; set; }
public string UserId { get; set; }
public string Email { get; set; }
[NotMapped]
public string Name { get; set; }
public string RoleName { get; set; }
public int RoutingOrder { get; set; }
public string Status { get; set; }
public DateTime StatusDate { get; set; }
public Recipient() { }
}
}
我的数据库上下文:
using Microsoft.EntityFrameworkCore;
using MyNamespace.Models;
namespace MyNamespace.Data
{
public class MyDbContext : DbContext
{
public virtual DbSet<Recipient> Recipient { get; set; }
public virtual DbSet<Envelope> Envelope { get; set; }
public virtual DbSet<Template> Template { get; set; }
public MyDbContext (DbContextOptions<MyDbContext> options) : base(options)
{ }
}
}
我失败的代码:
FormattableString sql = $"EXEC dbo.MyStoredProcedure @Param1={param1}, @Param2={param2}";
var result = await MyDbContext.Recipient.FromSqlInterpolated(sql).ToListAsync();
编辑 #1 ...
Envelope
对象模型:
public class Envelope
{
[Key]
public Guid EnvelopeId { get; set; }
public string Status { get; set; }
public DateTime StatusDate { get; set; }
public DateTime StatusPollDate { get; set; }
[NotMapped]
public List<Recipient> Recipients { get; set; }
public Envelope() {
Recipients = new List<Recipient>();
StatusPollDate = DateTime.Parse("1753-01-01");
}
}
存储过程结果集架构:
[RecipientId] bigint,
[Type] varchar(20),
[UserId] varchar(50),
[Email] varchar(100),
[RoleName] varchar(100),
[RoutingOrder] int,
[Status] varchar(13),
[StatusDate] datetime
阅读一些答案和评论后,我意识到 EF 正在创建影子属性,因为它识别出 Recipient
是 Envelope
对象的子对象.老实说,我真的应该在结果集中包含 EnvelopeId
(并删除 [NotMapped]
)以安抚 EF Core。我没有在存储过程的结果集中返回 EnvelopeId
的唯一原因是因为我一开始就将它作为输入参数传入,并认为传入某些内容会浪费网络资源然后在每个结果集记录中取回。
现在我不知道 EnvelopeId1
是从哪里来的,但这就是错误消息中提到的内容。正如您在我的对象模型和存储过程结果集架构中看到的那样,我只引用了 EnvelopeId
。我最好的猜测是,当 EF Core 决定制作影子属性时,它无法使用 EnvelopeId
因为我的对象模型中已经有了它,所以它创建了一个名为 EnvelopeId1
然后期望它出现在存储过程的结果集中。
最佳答案
出现此错误消息的原因有两个:
The required column 'EnvelopeId1' was not present in the results of a 'FromSql' operation
很明显,对于 SQL 结果集中的每一列,对象图中必须有一个对应的属性,您正在尝试水化,在本例中是您的 Recipient
类(class)没有EnvelopeId1
.
因为您的查询是一个存储过程,所以在这样的问题中发布 SQL 结果是明智的,因为它会显示您试图映射到对象图的 SQL 结构。
EnvelopeId1
的原因在您的 SQL 表中但不在您的对象图中是因为 Entity Framework 创建了一个 Shadow Property对于 foreign that you have not defined a property为。
您还没有列出 Envelope
的架构但我的钱说你有一个等价物ICollection<Recipient>
属性(property)。
创建 NotMapped
EnvelopeId
的属性(property)只会让这个模式更加困惑,我们应该正确地映射它,或者你应该从你的存储过程输出中省略它。
If you are going to use
FromSql
variants in EF (.Net or Core) then you should always define navigation properties in the schema classes as Shadow or Auto foreign key columns in the database will cause trouble unless you explicitly omit the columns that exist in the database but not in your schemaThis means no
SELECT *
you will have to explicitly define all columns.
方案一:修改存储过程
您可以简单地修改您的存储过程以不返回 EvelopeId1
从您的收件人表。
解决方案 2:为数据类中所有关系的两端完全定义属性
这里我用了EnvelopeId1
作为名称,因此不需要迁移,但我建议您将其更改为 EnvelopeId
,我个人使用数据库中任何以数字结尾的字段的存在来表明我的某些关系定义不充分。
public class Recipient
{
[Key]
public long RecipientId { get; set; }
public Guid? EnvelopeId1 { get; set; }
[ForeignKey(nameof(EnvelopeId1))]
public virtual Envelope Envelope { get; set; }
public string Type { get; set; }
public string UserId { get; set; }
public string Email { get; set; }
[NotMapped]
public string Name { get; set; }
public string RoleName { get; set; }
public int RoutingOrder { get; set; }
public string Status { get; set; }
public DateTime StatusDate { get; set; }
public Recipient() { }
}
这是基于您的 Envelope 类具有与此部分定义类似的定义的假设:
public class Envelope
{
[Key]
public Guid EnvelopeId { get; set; }
public virtual ICollection<Recipient> Recipients { get; set; } = new Hashset<Recipient>();
...
}
关于c# - 'FromSql' 操作的结果中不存在所需的列,[NotMapped] 没有帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58701419/
我有一个依赖于包 B 的包 A。当包 A 中的代码运行并访问包 B 中的类时,包 B 的状态将被解析 (4),而不是 Activity (32) 和包 B 的激活器也没跑好。我认为 bundle B
这个问题在这里已经有了答案: How to remove the space between inline/inline-block elements? (41 个回答) 关闭 7 年前。
我正在尝试使用 Java OpenAL 库。我在导入名为 libsoft_oal.so 的 native 库时遇到问题。 Java OpenAL 依赖于 OpenAL 软实现。我尝试根据他们在 git
我正在尝试启动我的应用程序。是一个 unicorn +工头+sinatra的应用。 这是我的 config.ru 文件: require "rubygems" require "sinatra" Bu
我有一个下拉列表,其中包含一些从数据库表中检索的值,我想要的是当单击按钮时它应该只获得选项标签的中间值,但只有那些类名为“get_this”的选项标签并离开那些选项,如果他们没有这个类 预期输出:值
我有一个index.php文件,需要一个通用的head.php文件,head.php文件中有几个Javascript文件,当这样尝试时,代码在源代码中看起来很好,但文件却不是实际上对文档做任何事情。
有人能帮帮我吗? 我已经像这样运行了 imsmod: $ insmod /data/mm/mmdev.ko epoll_rate=100 但是我得到一个错误: insmod: init_module
是否有键盘快捷键或插件可以在 Notepad++ 中打开 PHP 所需或包含的文件?我知道,在 Dreamweaver 中,执行此操作的命令是 Ctrl+D,但我似乎无法在 Notepad++ 中找到
我已经用 js 设置了一个显示/隐藏 div,但我很难弄清楚如何一次显示一个 div。目前发生的情况是,除非我再次单击原始链接来关闭该 div,否则每个 div 都会显示。 http://www.li
当我尝试将未分配的辅助分片分配给节点时出现错误。 { "error": { "root_cause": [ { "type": "remote_transpor
我正在构建一个 C++ 应用程序,使用 Netbeans 6.9 作为我的 IDE。我有一个 C++ 库,它是一个纯 C 库的包装器。 我已将文件正确添加到项目中(使用添加库文件选项)。这是 g++
我是一名优秀的程序员,十分优秀!