實體映射時,遇到複雜類型,可選擇下述方法處理: NotMapped,跳過映射 在複雜類型上聲明 [Owned],但僅限該複雜類型是全部由簡單值類型組成的 自定義序列化方法 示例: IPInfo使用了owned,對IPEndPoint使用自定義序列化,對VersionInfo使用JSON序列化 @@@... ...
實體映射時,遇到複雜類型,可選擇下述方法處理:
- NotMapped,跳過映射
- 在複雜類型上聲明 [Owned],但僅限該複雜類型是全部由簡單值類型組成的
- 自定義序列化方法
示例: 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;
}
}
}
}
@@#