亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

將一對一轉換為一對多關系問題

將一對一轉換為一對多關系問題

C#
慕神8447489 2023-07-22 15:53:39
我在將一對一關系更改為一對多關系時遇到了一些極端困難,而無需完全清除數據庫并重新開始(我無法合理地對生產數據庫執行此操作)。啟用自動遷移的實體框架 6(也無法更改此設置)。原始數據庫模式要求這些類之間存在一對一的關系(不相關的屬性已被刪除):public class Job? ? {? ? ? ? [Key]? ? ? ? public int JobIb { get; set; }? ? ? ? public virtual JobSite Location { get; set; }? ? }public class JobSite? ? {? ? ? ? [Key]? ? ? ? [ForeignKey("Job")]? ? ? ? public int JobSiteID { get; set; }? ? ? ? [Required]? ? ? ? public virtual Job Job { get; set; }? ? }隨后,需求更改為一對多(一個 JobSite 可以有多個 Job)public class Job? ? {? ? ? ? [Key]? ? ? ? public int JobIb { get; set; }? ? ? ? public virtual JobSite Location { get; set; }? ? }public class JobSite? ? {? ? ? ? [Key]? ? ? ? public int JobSiteID { get; set; }? ? ? ? public virtual ICollection<Job> Jobs { get; set; }? ? }這與EntityFrameworkTutorial上的約定 #3和Microsoft 的導航屬性示例相匹配。第一種方法進一步向下移動以進行歸檔。長話短說,您不能將現有列設為標識列我的下一個方法是在一次遷移中完全刪除 JobSites 表以及與 Job 表的關系,然后在第二次遷移中重新建立它們:這里的重點是為什么后續更新不會觸發EF認為模型與數據庫一致......步驟1public override void Up()? ? ? ? {? ? ? ? ? ? DropForeignKey("dbo.JobSites", "JobSiteID", "dbo.Jobs");? ? ? ? ? ? DropIndex("dbo.JobSites", new[] { "JobSiteID" });? ? ? ? ? ? DropTable("dbo.JobSites");? ? ? ? }? ? ? ? public override void Down()? ? ? ? {? ? ? ? ? ? CreateTable(? ? ? ? ? ? ? ? "dbo.JobSites",? ? ? ? ? ? ? ? c => new? ? ? ? ? ? ? ? ? ? {? ? ? ? ? ? ? ? ? ? ? ? JobSiteID = c.Int(nullable: false),? ? ? ? ? ? ? ? ? ? })? ? ? ? ? ? ? ? .PrimaryKey(t => t.JobSiteID);? ? ? ? ? ? CreateIndex("dbo.JobSites", "JobSiteID");? ? ? ? ? ? AddForeignKey("dbo.JobSites", "JobSiteID", "dbo.Jobs", "JobIb");? ? ? ? }最初這是有效的。但是,如果我刪除本地數據庫,并提取生產數據庫的新副本,并運行步驟 1 和步驟 2 遷移的更新數據庫,則會收到 System.InvalidOperationException 錯誤:&ldquo;自創建數據庫以來,支持&ldquo;ApplicationDbContext&rdquo;上下文的模型已更改。所以這非常令人沮喪。如果我添加遷移臨時,以查看它認為模型中發生了什么變化,我會得到與最初所做的完全相同的腳手架,就像它沒有注冊第 1 步和第 2 步遷移一樣。
查看完整描述

1 回答

?
繁星淼淼

TA貢獻1775條經驗 獲得超11個贊

我終于找到了解決辦法。請記住,該項目正在使用自動遷移。基本上,Step1 和 Step2 遷移方法已步入正軌,但是,在 Step1 和 Step2 之后應用了第三種自動遷移。我刪除了 Step2 遷移,實質上將其變成了自動遷移。當 update-database 運行時,它只應用 Step1,然后檢查模型,自動創建 Step2 的內容并運行它們,欺騙其他開發人員的機器使模型和數據庫重新保持一致。


public partial class ResetJobSites : DbMigration

    {

        public override void Up()

        {

            DropForeignKey("dbo.JobSites", "JobSiteID", "dbo.Jobs");

            DropIndex("dbo.JobSites", new[] { "JobSiteID" });

            DropTable("dbo.JobSites");

        }


        public override void Down()

        {

            CreateTable(

                "dbo.JobSites",

                c => new

                    {

                        JobSiteID = c.Int(nullable: false),

                    })

                .PrimaryKey(t => t.JobSiteID);


            CreateIndex("dbo.JobSites", "JobSiteID");

            AddForeignKey("dbo.JobSites", "JobSiteID", "dbo.Jobs", "JobIb");

        }

    }

PM> update-database

Specify the '-Verbose' flag to view the SQL statements being applied to the target database.

Applying explicit migrations: [201907291444500_ResetJobSites].

Applying explicit migration: 201907291444500_ResetJobSites.

Applying automatic migration: 201907291528423_AutomaticMigration.

PM> 

總結一下:要在打開自動遷移時將一對一轉換為一對多關系,您需要保留生產數據庫(但愿意接受正在轉換的表上的數據丟失)。

  • 創建顯式遷移以解耦兩個表(我通過注釋掉類、Job 表上的 nav 屬性、DbContext 中的 DbSet 以及構建項目所需的任何其他內容來實現此目的)。

  • 進行更改模型,將 nav 屬性添加回 Job 表(ICollection nav 屬性),將 DbSet 添加回 DbContext,然后讓自動遷移運行。

  • 首先不要讓自己陷入這種境地。


查看完整回答
反對 回復 2023-07-22
  • 1 回答
  • 0 關注
  • 155 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號