簡體   English   中英

如何離開孤立數據?

[英]How to leave orphaned data?

使用Visual Studio 2017,C#,實體框架.Net 6.2.0

我有一個表( LOG )具有到另一個表( BAR )的外鍵的設置。 我想從BAR刪除一個條目,而在LOG保持該條目和外鍵不變。

public class LOG
{
    [Key]
    public int id { get; set; }
    public string statusLog { get; set; }
    public virtual BAR bar { get; set; }
}

public class BAR
{
    [Key]
    public int id { get; set; }
    public string data { get; set; }
}

然后,我嘗試刪除一個條目。

BAR bar1 = DBContext.BARs.Where(b => b.id == enteredID).First();
DBContext.BARs.Remove(bar1);
DB.Context.SaveChanges();

並得到這個例外

DELETE語句與REFERENCE約束“ FK_dbo.LOG_dbo.BARs_BAR_id”沖突。 數據庫\\“ ******* \\”中的表“ dbo.LOG”的列“ BAR_id”中發生了沖突。

該語句已終止

如何在將條目保留在LOG表中的同時從BAR表中刪除條目? 我希望數據顯示在日志表中發生的情況,即使在系統中添加和刪除條目時也是如此。

從純實體框架的角度來看,請使用可Nullable 外鍵

public class LOG
{
    [Key]
    public int id { get; set; }
    public string statusLog { get; set; }
    public int? BarId{ get; set; }
    public virtual BAR bar { get; set; }
}

要考慮的事項:

盡管SQL Server支持它,但是當刪除相關對象時,EF無法設置級聯規則以使FK無效。

刪除Bar您需要將Logs加載到內存中以使它們為空...

查看任何相關問題,以使您能夠解決這個問題

刪除可選相關實體時如何將FK更新為null

您應該在日志類中添加一個id:

public class LOG
{
[Key]
public int id { get; set; }
public string statusLog { get; set; }
public int? BarId{ get; set; }

[ForeignKey("BarId")]
public virtual BAR bar { get; set; }
}

並修改OnModelCreating

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Log>()
            .HasOptional(p => p.bar)
            .WithMany()
            .HasForeignKey(p => p.barID);
 }

因此,這意味着關聯是可選的,當您刪除Bar時,它將更新Log.barid等於null並刪除相應的Bar。

但是首先,您應該全部加載它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM