簡體   English   中英

實體框架自定義類型作為屬性

[英]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; }
}

我有一個DateConverterDate 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"

如何使自定義類型DateDateTime作為屬性而不是實體類型?

或者

如何將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM