[英]Entity Framework custom type as property
我有一個自定義類型,例如:
public class Date
{
public int Year {get; }
public int Month {get; }
public int Day {get; }
private Date(int year, int month, int day)
{
// ... Year = year, Month = month, Day = day
}
public static Date Of(string pattern) {
// ... to parse from pattern
// return new Date(year, month, date);
}
public override string ToString(){
// ... string like "2020-02-02"
}
}
}
我想在實體中使用它以將其作為字符串存儲在數據庫中:
public class Student{
public string Name{get; set; }
public Date CreateDate{get; set; }
public DateTime CreateDate2{get; set; }
}
我有一個DateConverter
將Date
object 轉換為字符串:
class DateConverter : ValueConverter<Date, string>
{
public DateConvertor(ConverterMappingHints? mappingHints = null) :
base(date => date.ToString(), s => Date.Of(s), mappingHints)
{
}
}
但我無法應用 DateConvertor。
EF Core 將 Date 視為實體類型,而不是實體的屬性。
這意味着:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
foreach (IMutableEntityType entityType in modelBuilder.Model.GetEntityTypes())
{
// "Date" appears here as an Entity
_logger.Info("Model Entity: {0}", entityType);
foreach (IMutableProperty property in entityType.GetProperties())
{
// I want "Date" appears here as a property.
// Actually "DateTime CreateDate2" appears here.
// I want my "Date" to act like "DateTime"
如何使自定義類型Date
像DateTime
作為屬性而不是實體類型?
或者
如何將DateConverter
應用於我的Date
?
更新:這是示例之一。
抱歉,我無法分享我的真實代碼,因為它們屬於我的公司。
但問題是一樣的。
我想知道如何處理所有這些問題。
如果我有一個元數據,將其作為字符串(或數字)存儲在數據庫中怎么辦?
public class Metadata {
public int Field1 {get; }
public string Filed2 {get; }
public double Field3 {get; }
private Metadata(int xxx /* other params */ )
{
// to assign all
}
public static Metadata Parse (string pattern) {
// ... to parse from pattern
// return new Metadata(xxx);
}
public override string ToString(){
// ... string like "abc.id]afe[dfe]fefa"
// using a special encoding
}
}
class MetadataConverter : ValueConverter<Metadata, string>
{
public MetadataConverter(ConverterMappingHints? hints = null) :
base(data => data.ToString(), data => Metadata.Parse(data), mappingHints)
{
}
}
EF Core 將 Date 視為實體類型,而不是實體的屬性。
只有在這種情況下,我才能改用 DateTime,沒問題。 但是我每次都能找到替代解決方案嗎?
您可以將值 object 注冊為復雜類型,而不是將其轉換為可能在這種情況下但並非所有情況下都有效的 DateTime
這意味着 EF 會將您的Date
object 解釋為擁有它的Student
object 的“屬性包”,而不是它自己的單獨實體。 簡而言之,它將為每個公共屬性(日、月、年)創建一個表列(在父實體表中,例如[Students]
)。
但是,這確實需要您的屬性和無參數構造函數需要設置器,否則 EF 無法從數據庫中呈現您的值 object。
如果沒有 EF 可以處理的等效數據類型(例如DateTime
for Date
),這是更好的選擇。
只需在 OnModelCreating 中配置 ValueConverter,如下所示:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
var dateConverter = new ValueConverter<Date, string>(
v => v.ToString(),
s => Date.Parse(s)
);
foreach (var et in modelBuilder.Model.GetEntityTypes())
{
foreach (var prop in et.GetProperties().Where(prop => prop.ClrType == typeof(Date)))
{
prop.SetValueConverter(dateConverter);
//modelBuilder.Entity(et.Name).Property(prop.Name).HasConversion(dateConverter);
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.