[英]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
加載到內存中以使它們為空...
查看任何相關問題,以使您能夠解決這個問題
您應該在日志類中添加一個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.