5 回答

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超3個(gè)贊
錯(cuò)誤消息表明 EF Core 正在嘗試讀取所需string
屬性的值,即不應(yīng)在數(shù)據(jù)庫中具有值的屬性,而是底層數(shù)據(jù)讀取器在某些記錄中報(bào)告該屬性的值。null
null
查看您的實(shí)體模型和相應(yīng)的數(shù)據(jù)庫表,您可以看到許多string
屬性 ->varchar
列的明顯差異。CompanyStreetAddress
, CompanyCity
, CompanyZipCode
, CompanyVatNumber
, ContactFirstName
, ContactLastName
- 所有這些都[Required]
在模型中標(biāo)記為,但在表中沒有相應(yīng)not null
的約束。
所以問題是由這些列中的一個(gè)或多個(gè)引起的。
您需要修復(fù)該差異 - 可能通過刪除[Required]
屬性來解決,因?yàn)楝F(xiàn)有數(shù)據(jù)中的約束已被破壞。
它在某些較舊的 EF Core 版本中“有效”這一事實(shí)并不重要——這是不正確的映射,因此應(yīng)該修復(fù)。從技術(shù)上講,它不應(yīng)該從一開始就起作用。但請(qǐng)記住,EF Core 仍在積極開發(fā)中,并且有許多錯(cuò)誤將在下一個(gè)版本中修復(fù)。很可能在“工作”和“非工作”EF Core 版本之間進(jìn)行了一些代碼更改,這修復(fù)了以前的不正確行為。

TA貢獻(xiàn)1840條經(jīng)驗(yàn) 獲得超5個(gè)贊
如果您嘗試從數(shù)據(jù)庫中讀取一些可為空的數(shù)據(jù),但您的類型不可為空,則可能會(huì)出現(xiàn)此錯(cuò)誤。
如果MyInt在數(shù)據(jù)庫中可以為空并且您有此實(shí)體:
public class MyEntity
{
public int Id { get; set; }
public int MyInt { get; set; }
}
你會(huì)得到例外:System.Data.SqlTypes.SqlNullValueException: 'Data is Null. This method or property cannot be called on Null values.'
MyInt要解決此問題,只需將屬性的類型更改為Nullable<int>or int?:
public class MyEntity
{
public int Id { get; set; }
public int? MyInt { get; set; }
}
注意:這不是對(duì)原問題的回答,而是對(duì)標(biāo)題中問題的回答。

TA貢獻(xiàn)1872條經(jīng)驗(yàn) 獲得超4個(gè)贊
如果您從 C# 8 啟用最新的 Nullable 功能,也會(huì)出現(xiàn)這種異常。
EF Core,至少目前,它與 C# 8 可空類型不完全兼容。因此,例如,假設(shè)您為項(xiàng)目啟用了 Nullable 功能,如果您有這樣的類型:
public class MyEntity{ public string MyProperty { get; set; } }
即使該屬性未標(biāo)記 [Required] 屬性,EF 核心也會(huì)引發(fā)此類異常,因?yàn)樗?em>要求數(shù)據(jù)庫中的值不為空(即它不使用 IsDbNull 測試列值)。
有關(guān)如何在 EF 核心中處理可空引用類型的更多信息,請(qǐng)查看: https ://learn.microsoft.com/en-us/ef/core/miscellaneous/nullable-reference-types

TA貢獻(xiàn)1844條經(jīng)驗(yàn) 獲得超8個(gè)贊
為了解決類似的Data is Null
異常問題,我必須明確地放置IsRequired(false)
我的列映射。在我的例子中,我正在映射一個(gè)數(shù)據(jù)庫視圖。
builder.Property(x => x.MyProperty).IsRequired(false);

TA貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個(gè)贊
解決方案:是的,錯(cuò)誤“SqlNullValueException:數(shù)據(jù)為空?!?當(dāng)模型將導(dǎo)致問題的字段標(biāo)記為 [Required] 時(shí),當(dāng)(表的)列包含 NULL 時(shí)引起...使用數(shù)字字段可以輕松解決問題,但當(dāng)字段類型為字符串時(shí)問題非常糟糕。 .
想想下面2個(gè)類,用了一個(gè)分配路線的例子,每條路線都有一個(gè)司機(jī),當(dāng)然每個(gè)司機(jī)都有1條或多條路線。
public class Route
{
public int id { get; set; }
public string RouteName { get; set; }
[Required] \\==> FIELD CAUSING THE PROBLEM
public string UsuarioId { get; set; }
public virtual Usuario Driver { get; set; }
}
public class Usuario
{
public string Id {get;set;
public string Name { get; set; }
public virtual List<Route> Routes { get; set; } = new List<Route>();
}
你可能猜到了,一個(gè) Route 可以有一個(gè) driver(或者我稱之為 Usuario),但是一個(gè) Driver 可以有多個(gè) route,這就構(gòu)成了一對(duì)多的關(guān)系,如下所示:
protected override void OnModelCreating(ModelBuilder modelBuilder){
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Usuario>()
.HasMany<Route>(usuario => usuario.Routes)
.WithOne(route => route.Driver)
.HasForeignKey(route => route.UsuarioId)
.OnDelete(DeleteBehavior.SetNull);
}
根據(jù) FluentAPI,刪除驅(qū)動(dòng)程序時(shí),行為是將 UsuarioId 字段(在 Routes 模型中)設(shè)置為 NULL,但這違反了 [Required] 屬性。所以我們將無法刪除 Users(或 Drivers)表中的記錄。此外,如果我們?cè)跀?shù)據(jù)庫中已有數(shù)據(jù),在本例中,Routes with NULL UsuarioId,它會(huì)立即顯示錯(cuò)誤。
請(qǐng)記住,重點(diǎn)是:我們希望 [Required] 僅用于驗(yàn)證目的,因?yàn)槲覀兛赡軗碛猩形捶峙浣o驅(qū)動(dòng)程序(UserId)的路由,因此在數(shù)據(jù)庫中,它應(yīng)該被允許為 NULL ,而不是我們的 mvc 形式。
要解決此問題,請(qǐng)將該字段標(biāo)記為 [required],然后轉(zhuǎn)到您使用 Fluent API 定義關(guān)系的 DbContext 類,并指定該列不是必需的,如下所示:
modelBuilder.Entity<Route>()
.Property(p => p.UsuarioId).IsRequired(required: false);
因此該字段現(xiàn)在在注釋模式下是必需的,但最終將用于構(gòu)建數(shù)據(jù)庫的流式 API 不需要該字段。這將解決問題!
- 5 回答
- 0 關(guān)注
- 553 瀏覽
添加回答
舉報(bào)