我有一個使用 Entity Framework Core 3.1.5 的應用程式 (.NET Framework 4.8)。(我不敢升級,因為我覺得這可能會破壞其他依賴項 - 我很高興它可以正常作業。)
我正在使用“代碼優先”方法將資料從 SharePoint 匯出到 SQL 表中。一些 SharePoint“串列”(SharePoint 的表概念)可以包含 M:N 映射,我必須將其分離到單獨的 SQL 表中。
一些代碼:
// Base class for all parent tables
internal abstract class SharePointListModel
{
[SharePointColumn("ID")]
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Id { get; set; }
public virtual void PostProcess()
{
}
}
// Base class for all child tables
internal abstract class AdditionalTableModel
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
}
// This is the child table, which is never inserted
[Table("MyMappingTable", Schema = "myschema")]
internal class MyMappingTable : AdditionalTableModel
{
// This points to a third table, but it could really
// be any value. It could also be a string or BLOB etc.
public int OtherTableId { get; set; }
}
// This is the parent table, which is inserted correctly
[Table("MySharePointTable", Schema = "myschema")]
internal class MySharePointTable : SharePointListModel
{
[SharePointColumn("SharePointLookupColumn", UseId = true)]
[NotMapped]
public int[] OtherTableIds { get; set; }
public List<MyMappingTable> Mappings { get; set; } // Making the property virtual doesn't change anything either
public override void PostProcess()
{
Mappings = OtherTableIds?.Select(x => new MyMappingTable { OtherTableId = x }).ToList();
}
}
Entity Framework 似乎理解這一點,因為 dbContext.CreateTable() 創建了一個表“MyMappingTable”,其中包含三列(盡管只定義了兩個屬性):Id、OtherTableId(實際上是外鍵,但 EF 不知道)和MySharePointTableId(外鍵)。

但是當我像這樣插入資料時,M:N 映射表(MyMappingTable)仍然為空:
IList<MySharePointTable> = LoadSharePointTable();
dbContext.AddRange(data);
dbContext.SaveChanges();
顯式映射父級也無濟于事:
[Table("MyMappingTable", Schema = "myschema")]
internal class MyMappingTable : AdditionalTableModel
{
public virtual MySharePointTable Parent { get; set; }
public int OtherTableId { get; set; }
}
// [...]
public override void PostProcess()
{
Mappings = OtherTableIds?.Select(x => new MyMappingTable { Parent = this, OtherTableId = x }).ToList();
}
我也嘗試過顯式插入依賴行,但這并沒有改變任何東西:
IList<MySharePointTable> = LoadSharePointTable();
dbContext.AddRange(data);
IEnumerable<MyMappingTable> dependentRows = data.SelectMany(x => x.Mappings ?? Enumerable.Empty<MyMappingTable>());
dbContext.AddRange(dependentRows);
dbContext.SaveChanges();
或者像這樣,但這也不會改變任何東西,子表仍然是空的:
IList<MySharePointTable> = LoadSharePointTable();
dbContext.AddRange(data);
IEnumerable<MyMappingTable> dependentRows = data.SelectMany(x => x.Mappings ?? Enumerable.Empty<MyMappingTable>());
dbContext.Set<MyMappingTable>().AddRange(dependentRows);
dbContext.SaveChanges();
插入代碼在這里稍微簡化了,因為我實際上是在使用反射作為通用方法,但我認為這無關緊要。
我究竟做錯了什么?
uj5u.com熱心網友回復:
只是為了確定,這兩個名字不應該匹配嗎?因為一切似乎都是正確的,所以您不需要顯式插入子物體 EF 應該處理它。

uj5u.com熱心網友回復:
呃。好像我一直在看錯誤的資料庫......
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/459620.html
上一篇:運算式“u.Roles.AsQueryable().Select(r=>r.Name)”在“包含”操作中無效
下一篇:物體框架資料遷移
