第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用 ValueObjects 定義嵌套模型關系

如何使用 ValueObjects 定義嵌套模型關系

C#
HUWWW 2023-09-09 16:33:48
我有一個父子關系,其中父級有一個 ValueObject,但我無法確定如何正確定義該關系。為子/父關系添加遷移失敗并出現(xiàn)錯誤...實體類型“地址”需要定義主鍵。以下是當前的代碼結構。public class Address{        [Required]        public string BuildingNumber { get; private set; }                // other address properties...}public class Parent{        [Key]        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]        public int Id { get; protected set; }        [Required]        public Address PrimaryAddress { get; private set; }}public class ParentContext : DbContext{    public ParentContext(DbContextOptions<ParentContext> options) :      base(options)    {    }    public DbSet<Parent> Parents { get; set; }    protected override void OnModelCreating(ModelBuilder modelBuilder)    {        base.OnModelCreating(modelBuilder);        modelBuilder.Entity<Parent>().OwnsOne(p => p.PrimaryAddress);        // Flatten the ValueObject fields into table        modelBuilder.Entity<Parent>().OwnsOne(p => p.PrimaryAddress).            Property(b => b.BuildingNumber).IsRequired().                HasColumnName("Primary_BuildingName");     }}public class Child{        [Key]        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]        public int Id { get; protected set; }        [Required]        public int ParentId { get; private set; }        [ForeignKey("ParentId")]        public Parent Parent { get; private set; }}public class ChildContext : DbContext{    public ChildContext(DbContextOptions<ChildContext> options) : base(options)    {    }    public DbSet<Child> Children { get; set; }}使用上面的代碼示例,我可以運行單獨的命令來為父級和子級創(chuàng)建遷移,并且表看起來正確。添加遷移創(chuàng)建父-c 父上下文添加遷移創(chuàng)建子-c子上下文添加與實體的關系并添加最終遷移失敗。添加遷移添加父子fk -c子上下文僅當我的子級和父級處于不同的上下文中時,才會出現(xiàn)此問題。我嘗試在父級和子級中以不同的方式定義關系來映射地址字段,以便子級“理解”映射,但我無法避免我嘗試過的任何方法出現(xiàn) EF 錯誤。示例項目在這里https://github.com/cimatt55/ef-parent-valueobject
查看完整描述

1 回答

?
飲歌長嘯

TA貢獻1951條經(jīng)驗 獲得超3個贊

主要問題是不同的上下文。值對象(擁有的實體類型)只是一個結果 - 如果沒有值對象,那么您將會遇到另一個問題。

您的設計似乎基于一個錯誤的假設,即只有來自公開暴露的實體類DbSet。但事實并非如此。還包括導航屬性引用的實體,以及它們引用的實體等。

這是合乎邏輯的,因為 EF Core 上下文表示具有表和關系的數(shù)據(jù)庫。EF Core 需要了解所有相關實體,以便正確支持加載相關數(shù)據(jù)、查詢(聯(lián)接)、級聯(lián)刪除、表、列、主鍵和外鍵屬性/列及其映射等。

EF Core 文檔的包含和排除類型部分對此進行了解釋:

按照約定,上下文屬性中公開的類型DbSet將包含在模型中。此外,OnModelCreating還包括方法中提到的類型。最后,通過遞歸探索已發(fā)現(xiàn)類型的導航屬性找到的任何類型也包含在模型中。

調(diào)整他們的示例ChildContext,發(fā)現(xiàn)以下類型:

  • Child因為它暴露在DbSet上下文的屬性中

  • Parent因為它是通過Child.Parent導航屬性發(fā)現(xiàn)的

  • Address因為它是通過Parent.PrimaryAddress導航屬性發(fā)現(xiàn)的

由于ChildContext沒有實體配置,EF 假定與( 和)Parent相關的所有內(nèi)容均符合約定,因此出現(xiàn)例外。ParentAddress

Shorty,使用包含相關實體的單獨上下文不是一個好主意。解決方案是將所有相關實體放在一個上下文中并進行維護。

查看所使用的術語,您可能關注的是 DDD 和有界上下文,但這些不適合 EF Core(通常在關系數(shù)據(jù)庫中)模型。


查看完整回答
反對 回復 2023-09-09
  • 1 回答
  • 0 關注
  • 111 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號