1. 程式人生 > 其它 >EF OwnsOne 主鍵不自增

EF OwnsOne 主鍵不自增

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);
            }
        }