gpt4 book ai didi

c# - 虚拟属性不会在 Entity Framework 6 中延迟加载(警告)

转载 作者:行者123 更新时间:2023-11-30 16:50:09 24 4
gpt4 key购买 nike

我卡住了...

这是我的模型:

public class Payment 
{
[ForeignKey("RecipientId")]
public virtual Account Recipient { get; set; }

public string RecipientId { get; set; }

[Key, Column(TypeName = "char"), MaxLength(36)]
public string PaymentId { get; set; }
}

并且这个模型通过fluent API表示如下:

modelBuilder.Entity<Payment>()
.HasRequired(t => t.Recipient)
.WithMany()
.HasForeignKey(t => t.RecipientId)
.WillCascadeOnDelete(false);

这已经工作了将近 3 年。我们从未遇到过此映射的问题。

最近,我们决定将“MaxLength”属性更改为您在上面看到的内容。它从“8”变为“36”。

我们之前的 ID 开始冲突,因此是时候改变了。

更改代码中的所有内容都很好。我们的单元测试都通过了。当我们在本地运行项目时,我们会看到正确的结果。

投入生产也很微不足道。我们更改了表并重新调整了索引以反射(reflect)新的列类型长度(从 MaxLength(8)MaxLength(36))。

同样...这与我们在本地执行的程序相同。

问题来了:

使用新的、更长的“PaymentId”创建和保存的实体(付款)已完成且没有错误。添加关系似乎也没有错误。

当我们在 Entity Framework (Find、ToList、SingleOrDefault 等)中执行任何一个查询 API 时,就会出现错误。

我们的延迟加载不起作用。收件人为空!但是,在跟踪查询时,我们注意到 SQL 实际上正在返回数据。出于某种原因, Entity Framework 没有创建代理,并且对 Payment.Recipient 的任何引用都是空的。

此外,当我们对现有 ID(长度更改之前的 ID)执行请求时,我们可以毫无问题地获得结果。

所以问题:

  1. 为什么在本地工作(两个 ID 长度)而不是远程(在生产环境中)?

    • 什么类型的数据库设置会干扰此更改。
  2. 原始 SQL 执行在生产中有效,但在创建 poxy EF 时无效,为什么?

任何帮助都会很棒!

-- 添加原始 sql --

错误的请求

=========================================================
ID: 'bf08bdf4-a9d5-42e0-9236-a65faa4cc6ea '
=========================================================
SELECT
[Extent1].[TransactionId] AS [TransactionId],
[Extent1].[RecipientId] AS [RecipientId],
[Extent2].[AccountId] AS [AccountId],
[Extent2].[Name] AS [Name],
FROM [dbo].[Payment] AS [Extent1]
INNER JOIN [dbo].[Account] AS [Extent2] ON [Extent1].[RecipientId] = [Extent2].[AccountId]
=========================================================
Recipient is null...

好的请求

=========================================================
ID: 'f0e9beef '
=========================================================
SELECT
[Extent1].[TransactionId] AS [TransactionId],
[Extent1].[RecipientId] AS [RecipientId],
[Extent2].[AccountId] AS [AccountId],
[Extent2].[Name] AS [Name],
FROM [dbo].[Payment] AS [Extent1]
INNER JOIN [dbo].[Account] AS [Extent2] ON [Extent1].[RecipientId] = [Extent2].[AccountId]
=========================================================
Recipient is not null!
RecipientId: '835cbb56 '
Name: John Doe

!! 更新 !!

我正在调查 RAW sql 的结果,发现在新更改的属性上保存了额外的空间...

我偶然发现了 Ro Miller 的这篇文章:

http://romiller.com/2014/10/20/ef6-1workaround-trailing-blanks-issue-in-string-joins/

传达字符串截断可能是一个问题...让我们找出...

最佳答案

是的,

更改 ID 字段的长度后,我在 LINQ to Entity 查询返回时得到不需要的“空白”。

通过遵循 Ro Miller 的拦截器指南,我能够保证所有字符串字段在到达数据库的过程中都被修剪。

http://romiller.com/2014/10/20/ef6-1workaround-trailing-blanks-issue-in-string-joins/

请务必注意,EF6.1 最近才提供了 inceptor 功能。

希望对某人有所帮助...我今天在这上面花了 11 个小时。

关于c# - 虚拟属性不会在 Entity Framework 6 中延迟加载(警告),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35471286/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com