發表文章

目前顯示的是有「EntityFramework」標籤的文章

C# Entityframework, mssql, decimal精準度問題

C# Entityframework, mssql, decimal精準度問題 This is because Entity Framework, by default, maps the .NET decimal type to SQL Server's decimal(18,2) data type, which might not match the precision and scale you require for your specific use case. 由於Entity Framework, .Net decimal型別, 預計對應MSSQL decimal型別的精準度為decimal(18, 2), 所以當C#寫入資料包含小數第3位時, 寫入資料庫後會被截掉。 解決方案如下, 使用Fluent API:如果您使用的是Entity Framework 6,您可以在OnModelCreating方法中使用Fluent API來設定資料庫欄位的精確度和小數位數 protected override void OnModelCreating(DbModelBuilder modelBuilder) { //指定所有decimal欄位轉換 modelBuilder.Properties<decimal>().Configure(config => config.HasPrecision(18, 5)); //指定特定欄位轉換 modelBuilder.Entity<YourEntity>().Property(e => e.YourDecimalProperty).HasPrecision(18, 5); } 若為 Entity Framework Core, 也可使用下面2個寫法 (未實際驗證過是否可行) public Class YourEntity { [Column(TypeName = "decimal(18,5)")] public decimal YourDecimalProperty {get; set;} } protected override void OnModelCreating(ModelBuil...

使用EntityFramework批次刪除資料

使用EntityFramework批次刪除資料 using (EntitiesContext db = new EntitiesContext(connString)) { // Retrieve all records from database for deletion IEnumerable<entity> entityList = db.entity.where(x => x.id == id).toList(); // Use Remove Range function to delete all records at once db.entity.RemoveRange(entityList); // Save changes db.SaveChanges(); }  

C#, ASP.NET MVC, DBEntities動態決定連線Connection Name

在 C# 中使用 Entity Framework 時,可以建立一個繼承自 DbContext 的類別,例如 ABCEntities ,並在建構子中指定連接字串的名稱。然後,根據需要在執行時更改連接字串的名稱。 using System.Data.Entity; public class ABCEntities : DbContext { // 在這裡可以添加 DbSet 屬性和其他配置項 public ABCEntities(string connectionName) : base(connectionName) { } } 然後,在使用 ABCEntities 的地方,可以根據需要設定連接字串的名稱。例如: class Program { static void Main() { // 指定連接字串的名稱 string connectionName = "YourConnectionStringName"; // 使用指定的連接字串名稱建立 ABCEntities 實例 using (var dbContext = new ABCEntities(connectionName)) { // 在這裡可以執行資料庫操作 } } } 在上述範例中,可以根據需要更改 connectionName 的值,以選擇要使用的連接字串。這種方式可以在執行時動態指定連接字串的名稱,以便根據不同的邏輯選擇不同的資料庫連線。  

C#, EF6, 建立資料庫DBEntity物件

public class MyDBEntities : DbContext { public MyDBEntities() : base("name=DBConnectionName") { } public DbSet<Table1> Table1 { get; set; } public DbSet<Table2> Table2 { get; set; } //取得每個DbSet的內容 public IQueryable<TEntity> GetALL<TEntity>() where TEntity : class { return Set<TEntity>().AsQueryable(); } protected override void OnModelCreating(DbModelBuilder modelBuilder) { //讓Entity Framework啟動不再檢查__MigrationHistory表 Database.SetInitializer<MyDBEntities>(null); base.OnModelCreating(modelBuilder); } } 使用範例 Lambda using (GeneralEntities EPEntities = new GeneralEntities()) { var IQuery_Table1 = EPEntities.GetALL<Table1>(); List<Table1> IQuery_Table1 = IQuery_Table1.Where(x => x.AA == "123").ToList(); } LINQ using (GeneralEntities EPEntities = new GeneralEntities()) { var IQuery_Table1 = from t1 in EPEntities.Table1...

C#, Entity Framework 6, 繼承DbContext

using System; using System.Data.Entity; public class MyDbContext : DbContext { public MyDbContext() : base("YourConnectionString") { // 在建構子中指定資料庫連線字串,替換 "YourConnectionString" 為你的實際連線字串 // 禁用自動遷移初始化 __MigrationHistory 表格 Database.SetInitializer<MyDbContext>(null); } public DbSet<Student> Students { get; set; } // 這是資料庫中的一個表格 protected override void OnModelCreating(DbModelBuilder modelBuilder) { // 在這裡可以進行資料庫模型的配置,例如設定索引、關聯等等 base.OnModelCreating(modelBuilder); } }

C#, EntityFramework, LINQ TransactionScopeOption.Suppress

在使用 TransactionScope進行Transaction管控時, 在其區塊所有資料的異動和資料讀取, 都會受到Lock影響, 若希望其區塊有一個不同DbContext要讀取資料, 但因Table已被別的DbContext進行資料異動而Lock時, 可以在要讀取資料的程式碼外, 包上下面TransactionScope, 他將會獨立查詢資料 using (TransactionScope tss = new TransactionScope(TransactionScopeOption.Suppress)) { } TransactionScopeOption 是一個列舉(enum)類型,用於指定 TransactionScope 的行為選項。它定義了以下四個選項: Required (預設選項): 這個選項表示當前代碼塊需要參與到已經存在的事務中。如果當前代碼塊在進入事務範圍時已經存在一個事務,則它將參與到該事務中。如果事務不存在,則會創建一個新的事務。 如果當前代碼塊成功完成,則事務將提交;如果當前代碼塊拋出異常,事務將回滾。 RequiresNew : 這個選項表示當前代碼塊需要創建一個新的獨立事務,並參與到該新事務中。無論是否存在其他事務,都將創建一個新的事務並參與其中。 當前代碼塊的操作將在新的事務內執行,並且無論成功與否,都不會影響到其他事務。 Suppress : 這個選項表示當前代碼塊將禁用事務。也就是說,當前代碼塊的操作將不受事務的約束,即使其他事務正在進行,也不會參與到任何事務中。 當前代碼塊的操作將獨立執行,不會影響到其他事務。 NotAllowed : 這個選項表示當前代碼塊不允許參與到事務中。如果當前代碼塊嘗試進入事務範圍,將引發異常。 通常用於明確禁止某些代碼塊參與到事務中的情況。 使用這些不同的選項,你可以根據你的應用程序需求來管理事務,以確保數據的一致性和可靠性。不同的選項允許你定義事務的範圍和行為方式,以適應不同的情況。

C#, Entity Framework 執行速度優化

C#, Entity Framework, EF, 執行速度優化 .AsNoTracking() --> 資料不追蹤, 查詢結果不能直接執行SaveChanges() 以下是有關.AsNoTracking()的詳細說明: 跟蹤(Tracking):當你使用EF檢索數據時,EF默認會將檢索到的實體對象添加到內部上下文(DbContext)的跟蹤(或追蹤)中。這意味著EF將跟蹤這些對象的更改,並在適當的時候自動更新數據庫。 .AsNoTracking()的作用:當你調用.AsNoTracking()方法時,EF將停止跟蹤查詢返回的實體對象。這意味著即使你對這些對象進行了更改,EF也不會自動更新數據庫。這可以提高性能,特別是在只需要讀取數據而不需要進行更新操作的情況下。 性能優化:當你使用.AsNoTracking()時,EF不會生成額外的SQL語句來檢查實體對象的更改狀態 ,這可以減少數據庫交互的次數,從而提高性能。此外,不需要將實體對象添加到上下文的跟蹤中,也可以減少內存使用。 使用場景:.AsNoTracking()通常在以下情況下很有用: 當你只需要從數據庫中檢索數據,而不打算對其進行更新。 當你執行只讀操作,如報告生成或查詢操作。 當你處理大量數據,並且不需要EF自動追蹤所有這些對象的更改。 查詢結果不能直接執行SaveChanges() 可以透過把Entity.State變更為Modify後, 再SaveChange()。 var query = from data in dbContext.EntityABC.AsNoTracking() select data; 將Entity Framework的自動更改偵測功能關閉 DbContext.Configuration.AutoDetectChangesEnabled = false; 將Entity Framework的自動更改偵測功能關閉。當你對DbContext進行多個操作(如添加、更新、刪除實體)時,Entity Framework通常會自動檢測更改,並將其跟蹤在內部,以便在保存更改時進行適當的處理。將此設置為false會禁用自動更改偵測,這將在某些情況下提高性能,特別是當你處理大量數據時,因為它不再需要跟蹤每個...

C#, EntityFramework, LINQ 跨資料庫進行Transaction控制

利用 dbContext.Database.BeginTransaction() 來控制 範例程式 string ora_con_str = ConfigurationManager.ConnectionStrings["ora_cnn_str"].ToString(); string ms_con_str = ConfigurationManager.ConnectionStrings["ms_cnn_str"].ToString(); SqlConnection msDbConn = new SqlConnection(ms_con_str); OracleConnection oraDbConn = new OracleConnection(ora_con_str); msDbConn.Open(); oraDbConn.Open(); using (DbContext dbContextTT = new DbContext(oraDbConn, false)) using (DbContext dbContextMS = new DbContext(msDbConn, false)) { using (var transactionTT = dbContextTT.Database.BeginTransaction()) using (var transactionMS = dbContextMS.Database.BeginTransaction()) { try { sql = @" insert into TEST_ALEX(A,C) select '111', 33 from dual "; rec = dbContextTT.Database.ExecuteSqlCommand(sql); sql = @" insert into A (A1, A2, A3) select 'A11','22','33' ...

C# EntityFramework DBContext Timeout

public class MyContext : DbContext { public MyContext () : base(ContextHelper.CreateConnection("my connection string"), true) { ((IObjectContextAdapter)this).ObjectContext.CommandTimeout = 300; } } 逾時值 (以秒為單位)

Entiry Framework DB Default Value

  Oracle : 在DB Column直接設定Default Value MSSQL : 在DB Column設定Default Value, 並且需調整DBSet Class, 在該欄位上方新增 [DatabaseGenerated(DatabaseGeneratedOption.Computed)] public virtual DateTime CreatedDate { get; set; }