EF OwnsOne 主鍵不自增
阿新 • • 發佈:2022-05-09
menu public class Menu { /// <summary> /// id /// </summary> [Key, DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity), JsonIgnore] public int id { set; get; } /// <summary> /// 名稱 /// </summary> [MaxLength(100), Required]public string name { set; get; } /// <summary> /// 屬性 /// </summary> public virtual Meta meta{ get; set; } }
meta public class Meta { /// <summary> /// 名稱 /// </summary> [MaxLength(150), Required] public string title { set; get; } /// <summary> /// 圖示 /// </summary> [MaxLength(150)] public string icon { set; get; } /// <summary> /// 隱藏 /// </summary> public bool? hidden { set; get; } }
//EF [Owned] 已擁有 protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Menu>().OwnsOne(p => p.meta); } //問題 主鍵ID不自增 id = table.Column<int>(type: "int", nullable: false) //丟失 .Annotation("MySQL:ValueGenerationStrategy", MySQLValueGenerationStrategy.IdentityColumn),
//採用新的方法 屬性 Json轉物件 modelBuilder .Entity<Menu>() .Property(e => e.meta) .HasConversion( v => ObjectToJson(v), // 進入 Json轉物件 v => JsonToObject<Meta>(v), //返回 Json轉物件 new ValueComparer<Meta>( (c1, c2) => ObjectToJson(c1) == ObjectToJson(c2), c => c == null ? 0 : ObjectToJson(c).GetHashCode(), c => c) );
/// <summary> /// 物件轉json /// </summary> /// <param name="obj">物件</param> /// <returns></returns> protected string ObjectToJson(object obj) { string result = null; try { result = JsonSerializer.Serialize(obj); } catch { } return result; } /// <summary> /// 把Json文字轉為實體 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="input"></param> /// <returns></returns> protected T JsonToObject<T>(string input) { try { return JsonSerializer.Deserialize<T>(input); } catch { return default(T); } }