【步步為營 Entity Framework+Reporting service開發】-(2) Code Fir

来源:http://www.cnblogs.com/libing1/archive/2017/05/23/6895563.html
-Advertisement-
Play Games

也許有人問,為什麼要用EF創建愛你數據表,code first好處是什麼? 使用EF創建資料庫/表,只需要設計簡單的C#類,再表內容變化的時候他會自動更新資料庫結構,並且保留原有數據。 EF很強大,支持主外鍵並且能生成和db里一樣的數據類型。由於我們這兩個表簡單,關於進階的知識我會放在這篇文章的底部 ...


也許有人問,為什麼要用EF創建愛你數據表,code first好處是什麼?

使用EF創建資料庫/表,只需要設計簡單的C#類,再表內容變化的時候他會自動更新資料庫結構,並且保留原有數據。

EF很強大,支持主外鍵並且能生成和db里一樣的數據類型。由於我們這兩個表簡單,關於進階的知識我會放在這篇文章的底部作為附錄。

根據需求,我們有兩種 input 文件。一種是trend 的一種是bar的 我們先來看看這兩種文件里的數據:

Trend : 

id    taskid    taskname   time    b1    equal    b2    uncertain    grandtotal    
0     1         task1    2012-6-27    200    300    280    220    1000

Bar :

KeyWord    B1Better      Equal    B2Better     Winner   
聯眾    2    0    3    0    0    B1       
瘋狂倒計時    0    0    3    0    0    B2    
張娜拉    0    1    2    2    0    B1   
截圖軟體    1    0    1    1    2    B2   

 

我們需要show 2個 chart。

那麼我們設計2個表來存儲 trend chart 和barchart 的數據,名為Trend 和Bar(本來應該是3個表。由於我們是為了自己練習,設計2個就好。)

到這裡,我才發現我們還沒為我們的project 起名字呢。叫什麼好呢?我們就叫 ReportingSyncer吧。

Reporting(報表),sync(同步),為什麼加er?現在的project 命名的時候往往都擬人化,顯得生動外加比較給力。

【開始動手】

打開vs 2010創建一個新的class library 命名為ReportingDBManager。刪除自動生成的class1.cs 。

修改sln(解決方案的名稱為ReportingSyncer)。

修改命名空間:右鍵點擊ReportingDBManager。properties(屬性)->Application:CnBlogsDemos.ReportingDBManager。為啥要改?因為引用起來方便一點,而且也顯得專業:)

現在你的sln應該是這樣

添加Entity Framework 引用,得到這個dll 有兩種方法:

使用NuGet ,或者去下載一個dll。在這裡我使用Nuget ,EF最新版是4.3.1

【創建表的映射類】

添加完引用之後,我們就開始創建我們的表類了。

添加兩個class ,名為 Trend 和 Bar。

對應上邊input 文件的類型,我們設計兩張 匹配的表。

bar.cs:

namespace CnBlogsDemos.ReportingDBManager
{
    using System.ComponentModel;
    using System.ComponentModel.DataAnnotations;


    public class Bar
    {

        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)] //主鍵 自增
        public int ID { get; set; }
public int TaskID { get; set; }

        [MaxLength(200)]
        public string TaskName { get; set; }

        /*有朋友要問了,導入文件里明明沒有以上兩個欄位,為什麼要設定他們?
         因為導入的時候是根據每個task 導入的,我們會在commandline里數據task id 和task name
         這樣才可以讓兩個表聯繫起來,後期好做報表的drill down (鑽入)
        */

        [MaxLength(500)]
        public string KeyWord { get; set; }

        public int B1Better { get; set; }

        public int Equal { get; set; }

        public int B2Better { get; set; }

        [MaxLength(50)]
        public string Winner { get; set; }

        public string type { get; set; }

        [DefaultValue(true)]
        public bool IsActive { get; set; }
    }
}

trend.cs

namespace CnBlogsDemos.ReportingDBManager
{
    using System;
    using System.ComponentModel;
    using System.ComponentModel.DataAnnotations;

    public class Trend
    {
        public int id { get; set; }

        public int TaskID { get; set; }

        public string TaskName { get; set; }

        public DateTime Time { get; set; }

        public int B1Better { get; set; }


        public int Equal { get; set; }

        public int B2Better { get; set; }


        public int UnCertain { get; set; }


        public int GrandTotal { get; set; }

        [MaxLength(50)]
        public string type { get; set; }

        [DefaultValue(true)]
        public bool IsActive { get; set; }
    }
}

 

兩個表類創建好了。如何和資料庫聯繫到一塊呢?我們需要使用EF創建一個dbcontext類了。

添加新類:DbStoreContext.cs

namespace CnBlogsDemos.ReportingDBManager
{
    using System.Data.Entity;
    using System.Data.Entity.Migrations;


    internal sealed class ReportingDbMigrationsConfiguration : DbMigrationsConfiguration<DbStoreContext>
    {
        public ReportingDbMigrationsConfiguration()
        {
            AutomaticMigrationsEnabled = true;
            AutomaticMigrationDataLossAllowed = true;
        }
    }

    public class DbStoreContext : DbContext
    {
        public DbStoreContext()
            : base("name=ReportingDataBase")
        {
            Database.SetInitializer<DbStoreContext>(
                new MigrateDatabaseToLatestVersion<DbStoreContext, ReportingDbMigrationsConfiguration>());

            this.Configuration.LazyLoadingEnabled = false;
        }

        public DbSet<Bar> Bars { get; set; }
        public DbSet<Trend> Trends { get; set; }



    }
}

上邊的兩個Dbset 就是我們要創建的兩個表。

檢查項目中app.config文件,我們會看到:

  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="Data Source=.\SQLEXPRESS; Integrated Security=True; MultipleActiveResultSets=True" />
      </parameters>
    </defaultConnectionFactory>
  </entityFramework>

EF預設指定的資料庫是本地的Express。我們可以更改成其他標準資料庫或者是遠程資料庫(當然,你要有許可權哦)。

我們想在另一個project 里指定資料庫連接。先把這個appconfig刪除。

有朋友要問了,什麼時候能生成DB,table啊?我怎麼看不見?

別急,在我們第一次調用這個dbcontext 類的時候就會創建/更新啦!

我會在下一章做講解。

【附錄】

EF創建table 時候的一些技巧,查了好多資料,希望能幫助大家:

主鍵:

[Key]
public int EngineID { get; set; }

自增主鍵:

[Key,DatabaseGenerated(DatabaseGeneratedOption.None)]
public int EngineID { get; set; }

可以編輯的主鍵(預設是readonly)

[Key,Editable(true),DatabaseGenerated(DatabaseGeneratedOption.None)]
public int EngineID { get; set; }

非空欄位:

  [Required]
  public string EngineName { get; set; }

限定長度的非空欄位:

  [Required, MaxLength(256)]
   public string EngineName { get; set; }

外鍵比較特殊,需要解釋一下兩個table之間的關係。

table1包含 一個 欄位 taskID。

table task 的主鍵是taskID。需要創建愛你一個 task類型的欄位。關係如下:

public class Table1
{
  [Required, ForeignKey("Task")]
        public int TaskID { get; set; }

  public virtual Task Task { get; set; }

}

public class Task
{
  [Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
        public int TaskID { get; set; }
}

時間戳:

        [ConcurrencyCheck]
        [Timestamp]
        public byte[] TimeStamp { get; set; } 

c# 里的 int32 對應 db 里的int 。int16 對應 smallint,bool 對應bit,byte[]對應binary等等。

 

 

參考頁面:http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api;http://qingqingquege.cnblogs.com/p/5933752.html;https://docs.microsoft.com/zh-cn/aspnet/mvc/overview/releases/how-to-upgrade-an-aspnet-mvc-4-and-web-api-project-

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 應用程式分層設計 應用程式分層屬於關註點分離的一種形式,可以通過命名空間、文件夾或採用單獨的項目來實現。 下圖為一個採用分層設計的項目結構 ASPPatterns.Chap3.Layered.Repository依賴於ASPPatterns.Chap3.Layered.Model ASPPatter ...
  • 1.代碼是轉載的,此處記錄一下。 ...
  • 在做一個流程的時候,碰到了下麵的表數據直接從上表中獲取,並且為不可編輯狀態,沒有增加和刪除行的按鈕。一開始使用的是ComputationRule屬性,但是有一項是日期空間,沒有這個屬性,不知道怎麼處理,下麵是官方論壇給出的處理例子:在表單中,控制項類型為子表的數據項,其對於的前臺代碼其實就是Table ...
  • 1.在web中瀏覽pdf文件。 2.支持大多數主流瀏覽器,包括IE8 3.參考網址: https://pdfobject.com/ http://mozilla.github.io/pdf.js/ 引用的js文件下載地址:http://download.csdn.net/detail/wz12288 ...
  • 在web開發中經常會遇到在內部代碼中獲取Html,這些Html是需要和數據進行一起渲染。並不是直接把Html代碼返回給客戶端。這樣的做法有很多應用場景,例如分頁、Ajax一次性獲取幾段Html片段、生成郵件發送模板、生成Html靜態頁面等等。比較簡單的或者容易想到的做法就是直接拼接Html,當然這肯 ...
  • 本文主要是利用微軟自帶的控制項ReportViewer進行報表設計的小例子 涉及知識點: ReportViewer :位於Microsoft.Reporting.WinForms命名空間, 主要用於報表的顯示 Report:報表,以rdlc結尾的文件,可視化設計報表模板。 報表數據:內置欄位,參數,圖 ...
  • 什麼是委托? 官方解釋 委托是一種定義方法簽名的類型。當實例化委托時,您可以將其實例與任何具有相容簽名的方法相關聯。您可以通過委托實例調用方法。 個人理解 委托是一個持有一個或多個方法的對象,並且該對象可以被執行,可以被傳遞 使用方法 首先創建一個類或多個類並且創建方法有無參數都可以 使用關鍵字 d ...
  • WPF的依賴項屬性 屬性與事件是.NET抽象模型的核心部分。WPF使用了更高級的依賴項屬性(Dependency Property)功能來替換原來.NET的屬性,實現了更高效率的保存機制,還添加了附加功能,如屬性變更通知以及強制回調、屬性值繼承(在邏輯樹中向下傳播預設屬性值的能力)以及屬性有效性驗證 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...