VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > Objective-C编程 >
  • EF CORE中复杂类型的映射

实体映射时,遇到复杂类型,可选择下述方法处理:

  1. NotMapped,跳过映射
  2. 在复杂类型上声明 [Owned],但仅限该复杂类型是全部由简单值类型组成的
  3. 自定义序列化方法

 

示例: IPInfo使用了owned,对IPEndPoint使用自定义序列化,对VersionInfo使用JSON序列化

 

复制代码
@@@code

 

public class Controller : IController

    {

    public int SN { getset; }

      

    public IPInfo IPInfo { getset; } = IPInfo.Default;

      

    [Column(TypeName = "string")]

    public VersionInfo VersionInfo { getset; } = VersionInfo.Default;

     [Column(TypeName = "string")]

    public System.Net.IPEndPoint ServerIPEndPoint { getset; } = new System.Net.IPEndPoint(System.Net.IPAddress.Any, 0);

      

    public DateTime Time { getset; } = DateTime.Now;

}

 

[Owned]

    public class IPInfo

    {

    public static IPInfo Default { get; } = new IPInfo()

    {

        IP="192.168.0.254"

    };

    public string IP { getset; }

 

    public ushort Port { getset; } = 60000;

    public string Mac { getset; }

    public string Mask { getset; } = "255.255.255.0";

    public string Gateway { getset; } = "192.168.0.1";

    public bool Force { getset; }

 

    }

@@#

复制代码

 

 

自定义序列化

 

 

复制代码
@@@code

 

 

public class IPEndPointConverter : ValueConverter<System.Net.IPEndPoint, string>

    {

    public IPEndPointConverter(ConverterMappingHints mappingHints = null)

        : base(

         v => v.ToString(),

         v => System.Net.IPEndPoint.Parse(v),

         mappingHints)

    {

    }

 

    public static ValueConverterInfo DefaultInfo { get; }

        = new ValueConverterInfo(typeof(System.Net.IPEndPoint), typeof(string), i => new IPEndPointConverter(i.MappingHints));

    }

    public class JsonConverter<T> : ValueConverter<T, string>

    {

    public JsonConverter() : this(null)

    {

 

    }

      

    public JsonConverter(ConverterMappingHints mappingHints = null)

        : base(

         v => v.SerializeObject(),

         v => v.Deserialize<T>(),

         mappingHints)

    {

    }

 

    public static ValueConverterInfo DefaultInfo { get; }

        = new ValueConverterInfo(typeof(T), typeof(string), i => new JsonConverter<T>(i.MappingHints));

}

 

protected override void OnModelCreating(ModelBuilder modelBuilder)

    {

        base.OnModelCreating(modelBuilder);

        void aa<T>() where T : class

        {

        modelBuilder.Entity<T>().ToTable(typeof(T).Name.ToLower());

        }

          

        aa<User>();

        aa<Device>();

 

        foreach (var entityType in modelBuilder.Model.GetEntityTypes())

        {

 

        foreach (var property in entityType.GetProperties())

        {

            if (property.ClrType.IsValueType && !property.ClrType.IsGenericType)

            continue;

 

            switch (property.ClrType.Name)

            {

            case nameof(System.Net.IPEndPoint):

                property.SetValueConverter(new IPEndPointConverter()); //演示 owned效果,仅限复杂类型是由简单类型组成的,没有内嵌复杂类型

                break;

            case nameof(String):

                break;

            default:

                Type genType = typeof(JsonConverter<>).MakeGenericType(property.ClrType);

                ValueConverter obj = Activator.CreateInstance(genType) as ValueConverter;

                property.SetValueConverter(obj);

              break;

            }

 

        }

        }

 

    }

 

 

@@#

复制代码

文章出处:https://www.cnblogs.com/QinQouShui/p/12367563.html

相关教程