原創(chuàng)|產(chǎn)品更新|編輯:龔雪|2023-06-15 10:24:55.203|閱讀 136 次
概述:在新版中增強了DevExpress XAF實體框架的核心功能、支持EF Core 6 ORM等,歡迎下載最新版體驗!
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
DevExpress XAF是一款強大的現(xiàn)代應(yīng)用程序框架,允許同時開發(fā)ASP.NET和WinForms。DevExpress XAF采用模塊化設(shè)計,開發(fā)人員可以選擇內(nèi)建模塊,也可以自行創(chuàng)建,從而以更快的速度和比開發(fā)人員當(dāng)前更強有力的方式創(chuàng)建應(yīng)用程序。
在新版中增強了DevExpress XAF實體框架的核心功能、支持EF Core 6 ORM等,歡迎下載最新版體驗!
DevExpress技術(shù)交流群8:523159565 歡迎一起進群討論
用戶現(xiàn)在可以使用Entity Framework Core 6來訪問所有基于.NET 6 XAF(WinForms, Blazor和Web API Service)應(yīng)用程序中的數(shù)據(jù)。
當(dāng)用戶通過Entity Framework Core 6訪問數(shù)據(jù)時,現(xiàn)在可以使用變化跟蹤代理來自動檢測對象屬性的變化。一旦啟用了選項,將不再需要實現(xiàn)INotifyPropertyChanged和INotifyPropertyChanging來通知客戶端屬性值已經(jīng)改變。
這個新的增強功能幫助用戶簡化業(yè)務(wù)類實現(xiàn)。
考慮下面的示例,這是在v22.1中一個業(yè)務(wù)對象的實現(xiàn):
C#
public class BusinessObject : INotifyPropertyChanged { int id; string name; public int Id { get { return id; } set { if (id != value) { id = value; OnPropertyChanged(); } } } public string Name { get { return name; } set { if (name != value) { name = value; OnPropertyChanged(); } } } protected void OnPropertyChanged([CallerMemberName]string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } public event PropertyChangedEventHandler PropertyChanged; }
這是它在v22.2中的轉(zhuǎn)換方式:
C#
public class BusinessObject { public virtual int Id { get; set; } public virtual string Name { get; set; } }
可以對實現(xiàn)IObjectSpaceLink的對象進行相同的更改,例如這是v22.1中業(yè)務(wù)對象的實現(xiàn)。
C#
public class BusinessObject : IObjectSpaceLink { // ... public void SomeAction() { // some business-logic uses ObjectSpace } IObjectSpace objectSpace; IObjectSpace IObjectSpaceLink.ObjectSpace { get { return objectSpace; } set { objectSpace = value; } } }
這是它在v22.2中的樣子。
C#
public class BusinessObject { // ... public void SomeAction() { var objectSpace = ((IObjectSpaceLink)this).ObjectSpace; // some business-logic uses objectSpace } }
當(dāng)配置EF Core DbContext時,調(diào)用DbContextOptionsBuilder.UseObjectSpaceLinkProxies方法來為所有持久化類自動實現(xiàn)IObjectSpaceLink。
默認情況下,使用XAF Solution Wizard創(chuàng)建的所有新項目都啟用了UseChangeTrackingProxies選項。
抽象的DevExpress.Persistent.BaseImpl.EF.BaseObject類包括一個關(guān)鍵屬性,并實現(xiàn)了IObjectSpaceLink和IXafEntityObject接口。從'BaseObject'繼承避免樣板代碼,并在您的業(yè)務(wù)對象中實施最佳實踐。
用戶現(xiàn)在可以使用Entity Framework Core 6來訪問后端Web API / REST API應(yīng)用程序中的數(shù)據(jù),新版本中的Web API Service (CRUD、身份驗證和授權(quán))是免費的,作為.NET App Security & Web API Service的一部分提供。
使用服務(wù)端點(又名Reports Module)從報表模板和數(shù)據(jù)庫中過濾的數(shù)據(jù)下載PDF,使用api/Report/DownloadByKey, api/Report/DownloadByName端點,您可以從存儲在數(shù)據(jù)庫中的ReportDatav2容器中下載數(shù)據(jù)。
每個ReportDatav2鏈接到一個“XtraReport”,在Visual Studio IDE中設(shè)計的報表數(shù)據(jù)源和數(shù)據(jù)模型,用戶可以根據(jù)需要傳遞報表容器標識符、數(shù)據(jù)源標準和其他參數(shù)。
XAF的應(yīng)用程序向?qū)eportController自動添加到新的Web API應(yīng)用程序中,用戶可以擴展和修改此端點來滿足特定需求。
注意:此端點尊重安全權(quán)限。
使用服務(wù)端點記錄數(shù)據(jù)庫歷史變更(審計跟蹤模塊),通過Web API 端點中的ORM進行的任何數(shù)據(jù)更改都不會被注意到,您可以在RDBMS或XAF的管理UI (WinForms, Blazor和/或 ASP. NET Web Forms)中查看相關(guān)的日志歷史。
使用服務(wù)端點(文件附件模塊)下載存儲在數(shù)據(jù)庫中的BLOB數(shù)據(jù),使用api/MediaFile/DownloadStream端點,您可以從數(shù)據(jù)模型中聲明的FileData, MediaDataObject, Image或字節(jié)數(shù)組屬性中下載數(shù)據(jù)。
使用內(nèi)置(超過10條)或自定義驗證規(guī)則檢查Web API Service中輸入數(shù)據(jù)的狀態(tài) - 驗證模塊,現(xiàn)在您可以使用IValidator服務(wù)來驗證自定義端點中的輸入數(shù)據(jù)。
現(xiàn)在用戶可以在Web API Service中對非持久性和代理對象執(zhí)行CRUD操作(與其他持久性對象的方式相同),建議您從NonPersistentBaseObject或其他具有key屬性的類繼承,以強制執(zhí)行非持久化類的最佳實踐。
MainDemo應(yīng)用程序現(xiàn)在包含一個預(yù)配置的測試項目,其中包含基類和助手,以及最流行的使用場景fixture,該項目將幫助API開發(fā)人員為CRUD操作和自定義Web API Service端點編寫單元測試。
C#
[TestFixture] public class MyWebApiTests : BaseWebApiTest { [Test] public async Task TestPostDelete() { var newResult = await api.PostAsync( new TestObject { TestProperty = "test" } ); Assert.NotNull(await api.GetByKeyAsync<TestObject>(newResult.Oid.ToString())); var deleted = await api.DeleteAsync<TestObject>(newResult.Oid.ToString()); Assert.AreEqual(newResult.Oid, deleted.Oid); } [TestCase(typeof(Employee))] [TestCase(typeof(Paycheck))] [TestCase(typeof(Position))] public async Task TestGetBasic(Type objectType) { var result = await api.GetAllAsync(objectType); Assert.Greater(result.Length, 0); } }
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:慧都網(wǎng)