Showing posts with label C#. Show all posts
Showing posts with label C#. Show all posts

Thursday, December 5, 2019

.net entity framework 初步探討 (三) Code first

有點猶豫這個要放在 第一個 還是 第二個 xd

建立一個 ADO.NET 資料庫模型


選用 ADO.NET實體資料庫模型

Code generate db

產生一個資料庫並連接
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.Entity;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Data.Entity.Infrastructure;


namespace WindowsFormsApp1
{
    public class BlogContext : DbContext
    {
        public DbSet<Blog> Blogs { get; set; }
    }

    public class Blog
    {
        public int BlogId { get; set; }
        public string Name { get; set; }
    }
}
   using (var db = new BlogContext())
            {
                // Create and save a new Blog
                Console.Write("Enter a name for a new Blog: ");
                var name = Console.ReadLine();

                var blog = new Blog { Name = name };
                db.Blogs.Add(blog);
                db.SaveChanges();
            }
以現有資料庫去連接
    class video
    {
        [Key]
        public string title { get; set; }
        public string dec  { get; set; }
        public string dec2 { get; set; }
        public string dec3 { get; set; }
    }
    class MeContext : DbContext
    {
        public MeContext() : base(@"Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=WindowsFormsApp1.BlogContext;Integrated Security=True;") { }
        public DbSet<video> videos { get;set;}

    }

          
            using (var db = new MeContext()) 引用
            {
                String timeStamp = GetTimestamp(DateTime.Now);
                db.videos.Add(new video { title = timeStamp, dec ="test",dec2 ="123", dec3 = "123" });
                db.SaveChanges();

            }

Code first from db



按下後即可以產生相對應 code,這邊當然不只有 MSSQL 如果你要用 mysql 可以去 Nuget 去下載相對應的套件

這邊就是我們剛剛編寫的sql

那麼引用的方法就是,可能會遇到 video找不到的問題

他自動產生可能會多加一個s 可以在這邊進行修改
   using (var db = new Model1())
            {
                String timeStamp = GetTimestamp(DateTime.Now);
                db.videos.Add(new video { title = timeStamp, dec = "test", dec2 = "123", dec3 = "123" });
                db.SaveChanges();
                // Display all Blogs from the database
                var query = from b in db.videos
                            orderby b.title
                            select b;

                Console.WriteLine("All blogs in the database:");
                foreach (var item in query)
                {
                    Console.WriteLine(item.title);
                }

            }

Model 的 base


還記得前面幾系列的開頭嗎 不是有一個新增到App.config
這邊也可以進行修改

欄位發生異動

這篇文章講得很清楚
在 Package Manager Console  而不是在 一般的 console
Enable-Migrations
Add-Migration "AddEName"
Update-Database
範例
當 我的資料庫裡面沒有 videos 的table 的話或者 我們進行異動欄位 ,我們就可以透過這方法,不用重新砍掉資料庫而直接新增欄位重建等等

.net entity framework 初步探討 (二) EF model first

建立一個 ADO.NET 資料庫模型


選用 ADO.NET實體資料庫模型

EF model first from db

從"現有"的資料庫產生 EF model ,可以直接對現有 table 欄位進行修改 而不動到其 資料表結構


選用新增連接

當前現有資料庫


選完後準備產生模型


這邊可以看到我們的EF model 已經產生出來了

Empty EF model generate db

從空的 EF model 產生 資料庫

那麼這邊就可以進行直接的資料庫建構,從工具箱直接拉取需要的物件

包括一些關聯等等


一個部落格可以有很多文章
當資料庫設計好了之後我們可以直接產生相對應的 t-sql 語法

這邊在上面的範例已經填入相對應資料
這邊可以看到 會產生下列錯誤,這邊國外網友是說重開就好 xd(有更好解決方案以後再說,或請網友留言

重開後可以看到

已經可以產生相對應 SQL 檔案,我們再重新運行 SQL 腳本


好了直接連接

這邊可以看到到腳本已經運行完畢!,我們去開MSMS看一下 ,或者 visual stdion 旁邊的sql 瀏覽窗口也行


可以觀察一下結果是否跟你的資料庫設計是否吻合

.net entity framework 初步探討 (一)

什麼是 ORM

SQL server 對應成 物件導向
  • 將結構化的關聯資料對應到物件導向模型
把程式碼對應成 關聯資料 在寫回資料庫
  • 將物件資料對應成關聯資料
  • 所以這個可以解決

採用 ORM 技術有什麼好處?

對DBA 來說
  • 可以專注於DBA
    對開發人員來說
  • 可以專注於增強開發技巧
  • 不再侷限現有資料庫架構
  • 可以在開發時,更安全的進行重構

Entity framework 設計模式可以有三種

dba first
  • 先有資料庫再進行程式後續開發
    code first
  • 先寫程式碼後再產生資料庫
    model first
  • 先規劃model再產生資料庫

Entity framework install

在新開的專案裡右鍵->管理 NuGet 裡面安裝 EntityFramework

Install MSSQL


msms



連接一個現有的 mssql

後面幾個文章將寫如何透過 entity framework 去產生 資料庫

Friday, January 18, 2019

打造一個多人串流系統 c#xffmpeg part5

打造一個 c# 多執行緒 server


,接續上篇標體寫得上古語言  沒錯  hls m3u8格式失敗了,原因呢,
flex 已經停止更新一段時間了,又這麼剛好我要傳輸的音頻 沒有解碼器,flex 又沒有寫好的aac encode,adobe media server 的 音頻無法 壓成 aac 規格 導致m3u8 影音格式無法解析,後來
在想了 要交叉編譯後果斷放棄,真的沒辦法了嗎,在公司積極的轉型真的沒辦法了嗎,沒錯土法煉鋼的時間又到了,大致上的做法就是,在client對server端口發送rtmp訊號,這個時候就開啟多執行緒去呼叫,沒想到 ffmpeg 竟然可以當作串流轉接器, 解決方案就是,先上傳至
rtmp再進行 encode 在配合 c# 編寫的 server 再轉推送去其他流 這樣就大功告成囉,效能的話恩恩,很明顯可以看到處理都是在伺服器做處理,至於..hls 實在不是適合用於 即時傳輸影像,過幾天再來研究一下http flv格式到底是怎麼一回事  ,或許應該嘗試其他media server囉?

Sunday, June 24, 2018

Unity_實現2DRPG??

用了一堆Unity 開發2D遊戲


可以用觸控走路喔喔喔那詭異的步伐,是我debug用的

下載點丟到mega惹


Unity_魔術方塊教學軟體

當兵暑假可以完成哪些事情呢



拿起你的鱷魚皮小冊子,開始想辦法把魔術方塊轉成二維陣列,ㄏㄏ抽到密碼通譯兵,教官還以為我要抄密碼出去xd


,加上專題老師的要求魔術方塊教學軟體,老師看到了新聞說什麼日本教授透過手機拍照解魔術方塊,所以他想要做這個專題,還是硬接下來`,幾乎都是都是python呢,我們來用c#硬上吧xd
20141127 Taipei.py - PyCuber 用Python解魔術方塊

新增


修正一些bug,然後基於8355法去解魔術方塊
2.3實作內容
l   如何根據影像讀入魔術方塊
l   如何自動尋找魔術方塊解法
l   3D畫面呈現與動畫
l   把解法分層解法,並希望剛接觸的人也可以輕易把魔術方塊解出來
l   探討並分析,和其他人解法有何不同

三、原理與分析
3.1
讀魔術方塊顏色到電腦
將手上的魔術方塊狀態輸入到APP以便讓APP可以運算解答並用來教學,而魔術方塊顏色的讀入,可使用Unity直接引用OpenCV或者在Android封裝時順便將OpenCV包進去。但因這部份比較繁瑣,所以本專題採用簡單的圖形偵測方式,首先,把圖片進行邊緣化偵測後會得到一個白色外框矩形,(2)左方是取樣魔術方塊如(2)右邊的其中一面,圖上9個點是取樣的像素,用來判讀其顏色,就可取得魔術方塊的四個角落,再依比例就可以得到9塊區域的中心點,在對中心點做顏色的取樣,在背景雜訊不多時效果很好。
2. 色彩辨識
3.2 選擇魔術方塊解法
這邊解法使用台灣人許技江老師所發明,分為8底、3邊、5邊,而最後的5呢是基於工作區特殊的加一減一依序作左上右下或者下左上右,不管做幾次6次底層一定會回復到原先樣子,有這樣特性就可以來更換最後的五角完成魔術方塊。
3.3 自動尋解與教學
本專題的魔術方塊解答方式,以實作許技江老師所發明的8355法,8355法的特點是不用死背公式而是用理解的方式來解出魔術方塊,初學者可以快速上手,且不易忘記。


a.上層十字






b.工作區


c.底層十字
d.五角歸位
3  8355


4.魔術方塊轉換成2維陣列
       

5.魔術方塊向右旋轉2維陣列結果





3.4自動尋解:
(3)8355法的一些情形。(3c)的情況可使用(3b)工作區來進行邊塊和角塊的對調,最後的(3d)使用加一減一的算法來把最後五角歸位。
接下來就是把魔術方塊上各顏色的位置作轉換,成為比較好處理的二維陣列。一個立方空盒攤開後會有六個面,而魔術方塊為一個六面的立方體,亦可以類似地將其六面數位化。(4)為數位化的魔術方塊,其中的05數值分別代表六種顏色。
在對紅色一面如(5)所示,進行90度左右旋轉的時候,可以知道旋轉紅色面的話則會牽動到灰色區塊一併要進行旋轉,到這邊的時候魔術方塊已經可以用來判斷哪一面哪一點的顏色了。      
有了上面這些資訊,在做自動尋解的過程中,就只要先找到目標方塊在哪一面哪一點,然後把依照8355法或者其他解法,將方塊進行90度左右旋轉,把目標方塊轉至定位即可完成自動尋解這功能。





7.小方塊組成大方塊


3.5 3D畫面呈現
           在畫魔術方塊的時候我們採用Unity內建的3D矩形組合成(6)的這麼大的魔術方塊供需要273D矩形,所以只要把用先把位置弄出來,我們再依序把273D矩形放入到相對應位置,再配合3.4自動尋解中所提到的二維陣列就可以畫出一顆完整的魔術方塊。
3.6動畫的呈現
如圖6所示
程式碼去呼叫IEnumerator介面函數時,會先去執行裡面的函數,當遇到yield return 0;則暫時返回呼叫它的原先程式。Start()繼續往下做其他事情,Nowplay()則會繼續執行直到沒遇到yield return 0;則結束 IEnumerator ,將用這些函數來做畫面更新及延遲。
方塊旋轉
哪一面共包含哪九塊小方塊,這些在程式中已經配置好,如果我要對第0面進行旋轉,則第0面所牽動的九塊小方塊將會一併跟著旋轉,在旋轉的過程中,會呼叫旋轉函數並計算九個小方塊旋轉的角度,然後利用上面函數StartCoroutine來進行畫面的延遲及更新,將角度慢慢增加或減少,以呈現動畫。