1、EF默認使用級聯刪除 DeleteBehavior.Cascade
2、因為abp默認的對數據庫操作方法是異步的原因,即使是在數據庫操作方法后進行的對model的修改都會在執行數據庫操作方法之前完成,並將修改后的數據執行數據庫操作方法,因此產生了“內部請求發生錯誤”的報錯,因此最好只對dto進行修改,這樣並不會影響到輸入數據庫的數據。
3、對同一個表有多個外鍵的情況,要將[ForeignKey("Unit")]放到ID上,且Unit對象是virtual的,如果Foreign對象放到Unit上,則會報錯。
4、ef的實體引用跨模塊的別的聚合根實體,會報錯“The property 'ExtraProperties' could not be mapped”,需要在引用的實體上方增加[NotMapped]屬性。但是被加了NotMapped屬性的字段不能使用Include()方法。可以使用
5、repository.getdbcontext()和repository.getdbset()后可以使用reference和collection這兩個方法。reference查外鍵引用的對象,collection查聚合的List。需要在Service中使用。
public async Task TestMethod(Guid id)
{
ProductionDbContext productionDbContext= (ProductionDbContext)Repository.GetDbContext();
var manufacture = await GetEntityByIdAsync(id);
productionDbContext.Entry<Manufacture>(manufacture).Collection(c => c.Machines);
DbSet<Manufacture> manufactures = Repository.GetDbSet();//productionDbContext.Manufacture;
}
6、EF會自動追蹤查詢出來的數據,如果對數據中的導航屬性進行賦值,EF則視為插入一條對應數據,如果這個數據已經存在,則報錯不能插入重復值。通常出現在主表含有子表List的情況下,一起修改時會發生,很難解決,目前的辦法是主表和子表盡量分開修改,不對導航屬性賦值,只對model轉換后的dto賦值。
7、Ef 、List、 lamda 的動態排序分頁
8、如果設置了必填,就不能設置默認值,否則會報錯必填值不能為空。因為EF自動生成的插入語句中會減掉有默認值的字段,交給數據庫填入默認值。
9、擴展的包EFCore.BulkExtensions
使用bulkUpdate和bulkInsert等方法放到一個service方法中時,其中一個出錯,其他對數據庫的操作皆會回滾。
10、在同一個service方法中調用不同service的方法操作數據庫,其中一個拋出錯誤則所有操作回滾。
https://docs.abp.io/en/abp/latest/Unit-Of-Work
11、
在倉儲層中跨模塊調用DbContext或者實體,需要先注冊
這樣EF才能知道調用的Employee對應的table名稱是什么。
12、在DictApplicationAutoMapperProfile中配置
CreateMap<MaterialCompany, MaterialCompanyChange>()
.ForMember(desc => desc.Id, opt => opt.MapFrom(src => Guid.NewGuid()));
這樣的代碼的時候,由於實體繼承 FullAuditedEntity<Guid>,則Id是protected set;
執行語句
model = ObjectMapper.Map<MaterialCompany, MaterialCompanyChange>(materialCompany)
的時候發現modeld的Id沒有發生變化,配置沒有生效。
原因:由於MaterialCompanyChange類有構造函數
public MaterialCompanyChange(Guid id) : base(id){}
因此無法進行Id的重設,更深原因有待研究。
13、ef的自動提交
用ef查詢出的結果如果沒有設置AsNoTracking()是默認追蹤的,當對追蹤實體進行修改,比如賦值。
即使你沒有做出提交的操作,比如SaveChangeAsync()。
也會在執行完方法后自動提交修改結果到數據庫中去。
14、查詢異常報錯
[ERR] The association between entity types 'Employee' and 'ExceptionRecord' has been severed, but the relationship is either marked as required or is implicitly required because the foreign key is not nullable. If the dependent/child entity should be deleted when a required relationship is severed, configure the relationship to use cascade deletes. Consider using 'DbContextOptionsBuilder.EnableSensitiveDataLogging' to see the key values.
初步推測是由於有多條數據重復引用了同一employee表的同一數據,ef查詢語句增加AsNoTracking()方法即可。
15、關於EF Core繼承基類
已有Material實體,新建MaterialChange實體繼承Material,同時MaterialChange表增加一些額外的字段,同時要求包含Material表里所有的字段。
在DbContextModelCreatingExtension文件中對每個字段都進行配置。
builder.Entity<MaterialChange>(b =>
{
b.ToTable(DictConsts.DbTablePrefix + "MaterialChange", DictConsts.DbSchema).HasComment("模具物料變更").HasBaseType((Type)null);
b.ConfigureByConvention();
……
}
關鍵一定要加上HasBaseType((Type)null)才能在遷移的時候,把Material基類的字段也添加到MaterialChange表中。