EF CORE中复杂类型的映射

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

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

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

@@@code
public class Controller : IController

    {

    public int SN { get; set; }

      

    public IPInfo IPInfo { get; set; } = IPInfo.Default;

      

    [Column(TypeName = "string")]

    public VersionInfo VersionInfo { get; set; } = VersionInfo.Default;

     [Column(TypeName = "string")]

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

      

    public DateTime Time { get; set; } = DateTime.Now;

}

 

[Owned]

    public class IPInfo

    {

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

    {

        IP="192.168.0.254"

    };

    public string IP { get; set; }

 

    public ushort Port { get; set; } = 60000;

    public string Mac { get; set; }

    public string Mask { get; set; } = "255.255.255.0";

    public string Gateway { get; set; } = "192.168.0.1";

    public bool Force { get; set; }

 

    }

@@#

自定义序列化

@@@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;

            }

 

        }

        }

 

    }

 

 

@@#
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值