我有一個內部域,它有一個string屬性注釋。在我的資料庫中,我想將一個空的字串存盤為NULL,當我從資料庫中加載一個NULL時,我想這是一個空的字串。
我想我應該創建一個ValueConverter并注冊它,這樣就可以了。
public class StringEmptyToNullConverter : ValueConverter<string, string>
{
public StringEmptyToNullConverter(/span>) : base(ToDatabaseValue, ToDomainValue){}。
private static readonly Expression< Func<string, string>> ToDatabaseValue =>
domainValue => string.IsNullOrWhiteSpace(domainValue) ? null : domainValue;
private static readonly Expression< Func<string, string>> ToDomainValue = databaseValue =>
databaseValue ? string.empty;
}
在我的背景關系配置中,我將其注冊為builder.Property(x => x.Remark).HasConversion(new StringEmptyToNullConverter());,它仍然在資料庫中存盤一個空的字串或給我回傳一個NULL值。基本上,這被忽略了。
或者我把它注冊為字串。
或者我把它注冊為builder.Property(x => x.Opmerking).HasConversion<StringEmptyToNullConverter>();,這就會拋出一個錯誤:
屬性'Remark'的型別是'string',這不被當前的資料庫提供者支持。要么改變該屬性的CLR型別,要么使用'[NotMapped]'屬性或通過在'OnModelCreating'中使用'EntityTypeBuilder.Ignore'來忽略該屬性。
有人知道為什么我在轉換器中做錯了什么嗎?
補充:當我在lambda陳述句中設定斷點時,斷點從未被擊中。
我還試著直接注冊了lambdas。...HasConversion(domainValue => string.IsNullOrWhiteSpace(domainValue) ? null : domainValue, databaseValue => databaseValue ? ? string.Empty); 這與第一次注冊的結果相同。
uj5u.com熱心網友回復:
有兩個問題阻礙了這個作業。 鑒于:
modelBuilder.物體<客戶>()
.Property(c => c.Name)
.HasConversion(
ev => ev==""?null:ev,
dv => dv==null?"":dv
);
首先,查詢中的值轉換并沒有將謂詞轉換為is null,它只是生成= null,在標準SQL中,這永遠不會匹配任何行,因為null = null被評估為unknown,例如
這樣的查詢:
var q2 = from cust in db.customers
where cust.Name == ""/span>
select cust;
翻譯為
SELECT [c].[Id], [c].[Name]
FROM [Customers] AS [c]
WHERE [c].[Name] = NULL
第二,值覆寫器不能將資料庫中的null轉換為.NET中的"":
另外,值轉換器一般不允許將null轉換為 轉換為其他值。這是因為同一個值轉換器可以 這是因為同一個值轉換器可以同時用于可歸零和不可歸零的型別,這對于PK/FK組合非常有用。 這對于PK/FK組合非常有用,因為FK通常是可置空的,而PK則不是。 而PK不是。我們將討論是否添加對轉換的支持
https://github.com/dotnet/efcore/issues/13850
這一點目前根本無法作業。 因此,我們不想混合使用空字串和null(你也不想),如果你希望物體和資料庫之間保持一致,你唯一的選擇就是在兩個地方都使用null。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/327152.html
標籤:
