へっぽこプログラマーの備忘録
プログラムを中心とした個人的なメモ用のブログです。 タイトルは迷走中。
内容の保証はできませんのであしからずご了承ください。
menu
keyboard_arrow_up
Top
search
close
home
ホーム
computer
PC一般
construction
開発環境・ツール
code
プログラミング
home
ホーム
computer
PC一般
construction
開発環境・ツール
code
プログラミング
Home
›
Entity Framework Core
›
Entity Framework Core におけるリレーションシップについて
2018/01/11
Entity Framework Core におけるリレーションシップについて
update
event_note
label
Entity Framework Core
公式サイトに Entity Framework Core のリレーションシップについての記述がありますが、私のような初心者にはなかなか難しいので、和訳を兼ねて自分なりにまとめてみました。
- https://docs.microsoft.com/en-us/ef/core/modeling/relationships しかし、後半に行くほどただ和訳しただけになってしまいました・・・。 ## 環境 - Visual Studio 2017 - .NET Core 2.0 - Entity Framework Core 2.0 ## 用語 リレーションシップについて説明するにあたり、いろいろな用語が出てくるので、公式サイトではまず用語の定義から説明されています。 - https://docs.microsoft.com/en-us/ef/core/modeling/relationships 稚拙な訳ですが、とりあえずまとめてみました。 - **Dependent entity** 外部キーのプロパティを含んだエンティティ。リレーションシップにおける「子」になる。 - **Principal entity** プライマリ/代替キーのプロパティを含むエンティティ。リレーションシップにおける「親」になる。 - **Foreign key (外部キー)** 関連する Principal entity のキーを格納するための Dependent entity 内のプロパティ。 - **Principal key** Principal entity の主キーまたは代替キー。 - **Navigation property** Principal entity と Dependent entity の両方またはどちらかに定義される、関連するエンティティへの参照を含むプロパティ。 - **Collection navigation property** 多くの関連するエンティティへの参照を含む Navigation property。 - **Reference navigation property** 単一の関連エンティティへの参照を保持する Navigation property。 - **Inverse navigation property** 特定のナビゲーションプロパティについて説明するときおいて、リレーションシップのもう一方の Navigation property のこと。 以下にコードと用語の関係を示します。 ```cs // Blog is the principal entity public class Blog { // Blog.BlogId is the principal key // (in this case it is a primary key rather than an alternate key) public int BlogId { get; set; } public string Url { get; set; } // Blog.Posts is a collection navigation property public List
Posts { get; set; } } // Post is the dependent entity public class Post { public int PostId { get; set; } public string Title { get; set; } public string Content { get; set; } // Post.BlogId is the foreign key public int BlogId { get; set; } // Post.Blog is a reference navigation property // Post.Blog is the inverse navigation property of Blog.Posts (and vice versa) public Blog Blog { get; set; } } ``` ## Conventions ※ Convention だと意味がよくわかりませんが、ここでは EF Core の規則とでも言えばよいのでしょうかね。 Convention により、ある型に Navigation property があった場合にリレーションシップが作られます。 そのプロパティの指す型が現在のデータベースプロバイダーによってスカラ型としてマップされない場合、プロパティは Navigation property と見なされます。 Convention によるリレーションシップは、常に Principal entity の主キーを対象とします。 代替キーをターゲットにするには、Fluent API を使用して追加の設定を行う必要があります。 ## リレーションシップの完全な定義 最も一般的なリレーションシップのパターンは、そのリレーションシップの両端に定義された Navigation property と、Dependent entity クラス内に定義された外部キーを持つことです。 これは上記のコードの例で言えば、以下のことを指します。 - `Blog` クラス内に Navigation property として `Posts` を持つ - `Post` クラス内に Navigation property として `Blog` を持つ - `Post` クラス内に 外部キーとして `BlogId` を持つ 2つの型の間に `Navigation property` のペアがある場合、それらのプロパティはそのリレーションシップにおける `Inverse navigation property` として互いに設定されます。 **Dependent entity** に以下のいずれかの名前のプロパティがあれば、それは外部キーとして設定されます。 - `
` - `
` - `
` 上記の例で言えば、`Post` クラス内に、`BlogId` または `BlogBlogId` というプロパティがあればそれが外部キーとみなされることになり、`BlogId` が存在するため、これが外部キーとして設定されます。 もし2つの型の間に Navigation property が複数あれば、Convention によってリレーションシップは作成されないため、手動で設定する必要があります。 ## 外部キーがない場合 Dependent entity 内には外部キーのプロパティを持つことが推奨されますが、必須ではありません。 もし外部キーのプロパティがなければ、`
` という隠れた外部キーが用意されます。 (詳細は [Shadow Property](https://docs.microsoft.com/en-us/ef/core/modeling/shadow-properties) を参照) ```cs public class Blog { public int BlogId { get; set; } public string Url { get; set; } public List
Posts { get; set; } } public class Post { public int PostId { get; set; } public string Title { get; set; } public string Content { get; set; } // 外部キーなし public Blog Blog { get; set; } } ``` ## Single Navigation Property 1つの Navigation property だけを持つ場合(Inverse navigation と外部キーのプロパティがない場合)でも、Convention によってリレーションシップを持つことができます。 単一の Navigation property と外部キーを持つこともできます。 ``` public class Blog { public int BlogId { get; set; } public string Url { get; set; } // 単一の Navigation property だけを持つ public List
Posts { get; set; } } public class Post { public int PostId { get; set; } public string Title { get; set; } public string Content { get; set; } } ``` ## Cascade Delete ※ Cascade Delete は直訳すると連鎖的な削除といった感じでしょうか? Convention により、cascade delete は、必須のリレーションシップに対しては Cascade に、オプションのリレーションシップに対しては ClientSetNull に設定されます。 Cascade とは、依存するエンティティも削除されることを意味します。 ClientSetNull とは、メモリーにロードされない Dependent entity は変更されないため、手動で削除するか、有効な principal entity を指すように更新する必要があることを意味します。 メモリーにロードされたエンティティの場合、EF Core は外部キーのプロパティを null にセットしようとします。 必須のリレーションシップとオプションのリレーションシップについては [Required and Optional Relationships](https://docs.microsoft.com/en-us/ef/core/modeling/relationships#required-and-optional-relationships) を参照してください。 Convention によって行われる削除の振る舞いの違いについては、[Cascade Delete](https://docs.microsoft.com/en-us/ef/core/saving/cascade-delete) を参照してください。 ## Data Annotations リレーションシップを設定には、`[ForeignKey]` と `[InverseProperty]` の2つの Data Annotations があります。 ### [ForeignKey] Data Annotations を使用して、特定のリレーションシップの外部キープロパティーとして使用するプロパティーを設定することができます。 これは通常、外部キーのプロパティが Conventions によって検出されない場合に実行されます。 ```cs // Blog is the principal entity public class Blog { // Blog.BlogId is the principal key (in this case it is a primary key rather than an alternate key) public int BlogId { get; set; } public string Url { get; set; } // Blog.Posts is a collection navigation property public List
Posts { get; set; } } // Post is the dependent entity public class Post { public int PostId { get; set; } public string Title { get; set; } public string Content { get; set; } public int BlogForeignKey { get; set; } // Post.Blog is a reference navigation property [ForeignKey("BlogForeignKey")] public Blog Blog { get; set; } } ``` `[ForeignKey]` はリレーションシップ内のどこかの Navigation property に配置できます。 dependent entity クラス内の Navigation property に行く必要はありません。 ### [InverseProperty] You can use the Data Annotations to configure how navigation properties on the dependent and principal entities pair up. This is typically done when there is more than one pair of navigation properties between two entity types. Data Annotations を使用して、Dependent entity と Principal entity に Navigation property のペアを設定できます。 これは通常、2つのエンティティの間に1つ以上の Navigation property のペアがある場合に実行されます。 ```cs public class Post { public int PostId { get; set; } public string Title { get; set; } public string Content { get; set; } public int AuthorUserId { get; set; } public User Author { get; set; } public int ContributorUserId { get; set; } public User Contributor { get; set; } } public class User { public string UserId { get; set; } public string FirstName { get; set; } public string LastName { get; set; } [InverseProperty("Author")] public List
AuthoredPosts { get; set; } [InverseProperty("Contributor")] public List
ContributedToPosts { get; set; } } ``` ## Fluent API **Fluent API** でリレーションシップを設定するためには、リレーションシップを構成する Navigation property を指定します。 `HasOne` または `HasMany` は、設定を開始するエンティティの Navigation property を指定します。 その後、`WithOne` または `WithMany` を呼び出して、Inverse navigation property を指定します。 `HasOne` と `WithOne` は Navigation property に対して使用され、`HasMany` と `WithMany` は collection navigation properties に対して使用されます。 ```cs class MyContext : DbContext { public DbSet
Blogs { get; set; } public DbSet
Posts { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity
() .HasOne(p => p.Blog) .WithMany(b => b.Posts); } } public class Blog { public int BlogId { get; set; } public string Url { get; set; } public List
Posts { get; set; } } public class Post { public int PostId { get; set; } public string Title { get; set; } public string Content { get; set; } public Blog Blog { get; set; } } ``` ### Single Navigation Property Navigation property が1つしかない場合、 `WithOne` と `WithMany` には引数なしのオーバーロードがあります。 これは、リレーションシップのもう一方の端には、概念的に参照またはコレクションがあることを示しますが、エンティティクラスには Navigation property は含まれていません。 ```cs class MyContext : DbContext { public DbSet
Blogs { get; set; } public DbSet
Posts { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity
() .HasMany(b => b.Posts) .WithOne(); } } public class Blog { public int BlogId { get; set; } public string Url { get; set; } public List
Posts { get; set; } } public class Post { public int PostId { get; set; } public string Title { get; set; } public string Content { get; set; } } ``` ### Foreign Key Fluent APIを使用して、特定のリレーションシップの外部キープロパティーとして使用するプロパティーを設定できます。 ```cs class MyContext : DbContext { public DbSet
Blogs { get; set; } public DbSet
Posts { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity
() .HasOne(p => p.Blog) .WithMany(b => b.Posts) .HasForeignKey(p => p.BlogForeignKey); } } public class Blog { public int BlogId { get; set; } public string Url { get; set; } public List
Posts { get; set; } } public class Post { public int PostId { get; set; } public string Title { get; set; } public string Content { get; set; } public int BlogForeignKey { get; set; } public Blog Blog { get; set; } } ``` 以下のコードは複合外部キーを設定する方法です。 ```cs class MyContext : DbContext { public DbSet
Cars { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity
() .HasKey(c => new { c.State, c.LicensePlate }); modelBuilder.Entity
() .HasOne(s => s.Car) .WithMany(c => c.SaleHistory) .HasForeignKey(s => new { s.CarState, s.CarLicensePlate }); } } public class Car { public string State { get; set; } public string LicensePlate { get; set; } public string Make { get; set; } public string Model { get; set; } public List
SaleHistory { get; set; } } public class RecordOfSale { public int RecordOfSaleId { get; set; } public DateTime DateSold { get; set; } public decimal Price { get; set; } public string CarState { get; set; } public string CarLicensePlate { get; set; } public Car Car { get; set; } } ``` `HasForeignKey(...)` の文字列オーバーロードを使用して、Shadow property を外部キーとして構成できます。 (詳細は、[Shadow Properties](https://docs.microsoft.com/en-us/ef/core/modeling/shadow-properties) を参照)。 外部キーとして使用する前に、Shadow property をモデルに明示的に追加することを推奨します(下記参照)。 ```cs class MyContext : DbContext { public DbSet
Blogs { get; set; } public DbSet
Posts { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { // Add the shadow property to the model modelBuilder.Entity
() .Property
("BlogForeignKey"); // Use the shadow property as a foreign key modelBuilder.Entity
() .HasOne(p => p.Blog) .WithMany(b => b.Posts) .HasForeignKey("BlogForeignKey"); } } public class Blog { public int BlogId { get; set; } public string Url { get; set; } public List
Posts { get; set; } } public class Post { public int PostId { get; set; } public string Title { get; set; } public string Content { get; set; } public Blog Blog { get; set; } } ``` ### Principal Key 外部キーが主キー以外のプロパティーを参照するようにするには、Fluent API を使用してリレーションシップの Principal key のプロパティーを指定します。 Principal key として設定したプロパティは、自動的に代替キーとして設定されます。 (詳細については、[Alternate Keys](https://docs.microsoft.com/en-us/ef/core/modeling/alternate-keys) を参照してください)。 ```cs class MyContext : DbContext { public DbSet
Cars { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity
() .HasOne(s => s.Car) .WithMany(c => c.SaleHistory) .HasForeignKey(s => s.CarLicensePlate) .HasPrincipalKey(c => c.LicensePlate); } } public class Car { public int CarId { get; set; } public string LicensePlate { get; set; } public string Make { get; set; } public string Model { get; set; } public List
SaleHistory { get; set; } } public class RecordOfSale { public int RecordOfSaleId { get; set; } public DateTime DateSold { get; set; } public decimal Price { get; set; } public string CarLicensePlate { get; set; } public Car Car { get; set; } } ``` 次のコードは、Principal key の複合キーを指定する方法を示しています。 ```cs class MyContext : DbContext { public DbSet
Cars { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity
() .HasOne(s => s.Car) .WithMany(c => c.SaleHistory) .HasForeignKey(s => new { s.CarState, s.CarLicensePlate }) .HasPrincipalKey(c => new { c.State, c.LicensePlate }); } } public class Car { public int CarId { get; set; } public string State { get; set; } public string LicensePlate { get; set; } public string Make { get; set; } public string Model { get; set; } public List
SaleHistory { get; set; } } public class RecordOfSale { public int RecordOfSaleId { get; set; } public DateTime DateSold { get; set; } public decimal Price { get; set; } public string CarState { get; set; } public string CarLicensePlate { get; set; } public Car Car { get; set; } } ``` Principal key のプロパティーを指定する順序は、それらが外部キーに指定されている順序と一致していなければなりません。 ### Required and Optional Relationships Fluent API を使用して、リレーションシップが必須かオプションかを設定できます。 最終的には、外部キーのプロパティが必須かオプションかどうかで制御します。 これは、隠れた状態の外部キーを使用している場合に最も便利です。(?) エンティティクラスに外部キーのプロパティがある場合、リレーションシップの必要性に応じて、外部キーのプロパティが必須かオプションかが判断されます。 (詳細は、[Required and Optional properties](https://docs.microsoft.com/en-us/ef/core/modeling/required-optional) を参照)。 ```cs class MyContext : DbContext { public DbSet
Blogs { get; set; } public DbSet
Posts { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity
() .HasOne(p => p.Blog) .WithMany(b => b.Posts) .IsRequired(); } } public class Blog { public int BlogId { get; set; } public string Url { get; set; } public List
Posts { get; set; } } public class Post { public int PostId { get; set; } public string Title { get; set; } public string Content { get; set; } public Blog Blog { get; set; } } ``` ### Cascade Delete Fluent APIを使用すると、特定のリレーションシップの連鎖的な削除処理を明示的に設定できます。 各オプションの詳細については、Saving Data セクションの [Cascade Delete](https://docs.microsoft.com/en-us/ef/core/saving/cascade-delete) を参照してください。 ```cs class MyContext : DbContext { public DbSet
Blogs { get; set; } public DbSet
Posts { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity
() .HasOne(p => p.Blog) .WithMany(b => b.Posts) .OnDelete(DeleteBehavior.Cascade); } } public class Blog { public int BlogId { get; set; } public string Url { get; set; } public List
Posts { get; set; } } public class Post { public int PostId { get; set; } public string Title { get; set; } public string Content { get; set; } public int? BlogId { get; set; } public Blog Blog { get; set; } } ``` ## Other Relationship Patterns ### 一対一 一対一のリレーションシップでは、両方に Reference navigation property があります。 それらは1対多のリレーションシップと同じ規則に従いますが、1つの Dependent entity だけが各 Principal entity に関連していることを保証するために、外部キープロパティに固有のインデックスが導入されています。(?) ```cs public class Blog { public int BlogId { get; set; } public string Url { get; set; } public BlogImage BlogImage { get; set; } } public class BlogImage { public int BlogImageId { get; set; } public byte[] Image { get; set; } public string Caption { get; set; } public int BlogId { get; set; } public Blog Blog { get; set; } } ``` EF は、外部キーのプロパティを検出できるかどうかに基づいて、エンティティの1つを Dependent entity として選択します。(?) 間違ったエンティティが Dependent entity として選択された場合は、Fluent API を使用して修正することができます。 Fluent API でリレーションシップを設定するときは、`HasOne` メソッドと `WithOne` メソッドを使用します。 外部キーを設定するときは、Dependent entity の型を指定する必要があります。 以下のコードの `HasForeignKey` に提供されている汎用パラメータに注意してください。 一対多のリレーションシップでは、Reference navigation property を持つエンティティが Dependent entity であり、コレクションを持つエンティティが Principal entity であることは明らかです。 しかし、一対一のリレーションシップではそのようなことはないため、明示的に定義する必要があります。 ```cs class MyContext : DbContext { public DbSet
Blogs { get; set; } public DbSet
BlogImages { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity
() .HasOne(p => p.BlogImage) .WithOne(i => i.Blog) .HasForeignKey
(b => b.BlogForeignKey); } } public class Blog { public int BlogId { get; set; } public string Url { get; set; } public BlogImage BlogImage { get; set; } } public class BlogImage { public int BlogImageId { get; set; } public byte[] Image { get; set; } public string Caption { get; set; } public int BlogForeignKey { get; set; } public Blog Blog { get; set; } } ``` ### 多対多 結合テーブルを表すエンティティクラスがない多対多のリレーションシップは、まだサポートされていません。 ただし、多対多のリレーションシップは、結合テーブルのエンティティクラスを組み込み、2つの異なる一対多のリレーションシップをマッピングすることで表現できます。 ```cs class MyContext : DbContext { public DbSet
Posts { get; set; } public DbSet
Tags { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity
() .HasKey(t => new { t.PostId, t.TagId }); modelBuilder.Entity
() .HasOne(pt => pt.Post) .WithMany(p => p.PostTags) .HasForeignKey(pt => pt.PostId); modelBuilder.Entity
() .HasOne(pt => pt.Tag) .WithMany(t => t.PostTags) .HasForeignKey(pt => pt.TagId); } } public class Post { public int PostId { get; set; } public string Title { get; set; } public string Content { get; set; } public List
PostTags { get; set; } } public class Tag { public string TagId { get; set; } public List
PostTags { get; set; } } public class PostTag { public int PostId { get; set; } public Post Post { get; set; } public string TagId { get; set; } public Tag Tag { get; set; } } ```
tweet
facebook
Pocket
B!
はてブ
LINE
chevron_left
chevron_right
Translate
Popular Posts
TortoiseGit でコミットメッセージを変更する
image
NO IMAGE
smbclient で session setup failed: NT_STATUS_LOGON_FAILURE が表示される
Docker for Windows の設定
image
NO IMAGE
TortoiseSVN ロック状態のチェック
image
NO IMAGE
マージ元ブランチとマージ先ブランチ
image
NO IMAGE
Visual Studio で文字がにじむ(ぼやける)
TortoiseGit でブランチ間の差分を見る
image
NO IMAGE
AsciidocFX をビルドする
image
NO IMAGE
PowerShellでブレークポイントが設定できない場合
[Python] 文字列の判定で、None と空文字を同時に判定する
Labels
.NET Core
31
.NET Framework
17
.NET Standard
2
AdminLTE
1
AI
1
Apache
3
AppVeyor
2
AsciiDoc
7
ASP.NET Core
55
Atom
4
AWS
5
AWS Cloud9
4
blockdiag
1
Blogger
13
Bootstrap
3
C/C++
6
C#
106
CentOS
3
Chrome
1
Chronograf
3
chrony
1
Codecov
1
CSS
1
Docker
82
DokuWiki
4
Doxygen
1
draw.io
1
EasyTag
1
Electron
1
Electron.NET
2
Entity Framework Core
9
Excel
2
FFmpeg
3
Firefox
6
Flask
1
Git
19
GitBook
4
GitBucket
7
GitHub
7
GitLab
39
Go
1
Google
1
Google Cloud Platform
1
Grafana
13
GStreamer
2
HTML
5
IIS
8
InfluxDB
14
JavaScript
15
Jekyll
3
Jenkins
7
Linux
34
Log4View
1
MahApps.Metro
3
MaterialDesignInXamlToolkit
1
MkDocs
2
MongoDB
5
MVC
1
MVVM
6
nginx
3
NLog
3
Node.js
8
npm
1
NVIDIA
3
onvif
1
OpenAPI
2
OpenCV
4
OpenSSL
3
OpenVINO
2
ownCloud
2
pandas
1
Pine Script
1
PlantUML
5
Portainer
3
PowerShell
8
Prism
2
PySide
19
Python
88
PyTorch
1
RabbitVCS
1
Razor
3
redis
1
Redmine
33
Redoc
1
remark.js
2
rocketchat
10
Ruby
3
scikit-learn
1
shotcut
1
SignalR
1
Slack
1
Socket.IO
1
SonarQube
5
Sphinx
10
SQL Server
5
SQLite
1
StableDiffusion
2
Subversion
2
Swagger
1
Swarmpit
1
Syslog
3
Telegraf
6
Tesseract
3
TestLink
2
Tomcat
2
TortoiseGit
11
TortoiseSVN
2
Trading View
1
Traefik
3
Travis CI
1
Ubuntu
31
Visual Studio
39
Visual Studio Code
10
VSCode
8
Vue.js
8
Windows
62
Windows 10
5
Windows ADK
1
Windows API
2
Windows Embedded
4
wkhtmltopdf
2
Word
3
WPF
12
WSL
5
WSL2
5
Xamarin
1
xUnit
5
yaml
1
yolo
1
アプリケーション
1
デザインパターン
1
テスト
1
バッチファイル
2
プログラミング
4
ライセンス
1
暗号資産(仮想通貨)
1
英語
2
確定申告
1
機械学習
1
強化学習
1
雑記
1
書籍
1
数学
1
正規表現
1
動画編集
1
Blog Archive
►
2024
(21)
►
12月
(3)
►
9月
(5)
►
8月
(1)
►
7月
(2)
►
6月
(1)
►
4月
(2)
►
3月
(1)
►
2月
(5)
►
1月
(1)
►
2023
(30)
►
12月
(3)
►
11月
(5)
►
10月
(2)
►
9月
(1)
►
8月
(2)
►
7月
(4)
►
6月
(2)
►
5月
(3)
►
4月
(2)
►
3月
(2)
►
2月
(3)
►
1月
(1)
►
2022
(106)
►
12月
(5)
►
11月
(1)
►
10月
(3)
►
9月
(6)
►
8月
(7)
►
7月
(6)
►
6月
(13)
►
5月
(9)
►
4月
(15)
►
3月
(11)
►
2月
(14)
►
1月
(16)
►
2021
(85)
►
12月
(11)
►
11月
(6)
►
10月
(4)
►
9月
(10)
►
8月
(8)
►
7月
(4)
►
6月
(18)
►
5月
(7)
►
4月
(8)
►
3月
(2)
►
2月
(2)
►
1月
(5)
►
2020
(56)
►
12月
(1)
►
11月
(3)
►
10月
(3)
►
9月
(3)
►
8月
(3)
►
7月
(7)
►
6月
(7)
►
5月
(2)
►
4月
(6)
►
3月
(6)
►
2月
(3)
►
1月
(12)
►
2019
(92)
►
12月
(13)
►
11月
(9)
►
10月
(3)
►
9月
(2)
►
8月
(3)
►
7月
(5)
►
6月
(11)
►
5月
(6)
►
4月
(17)
►
3月
(9)
►
2月
(6)
►
1月
(8)
▼
2018
(100)
►
12月
(1)
►
11月
(11)
►
10月
(8)
►
9月
(6)
►
8月
(10)
►
7月
(10)
►
6月
(8)
►
5月
(9)
►
4月
(8)
►
3月
(14)
►
2月
(4)
▼
1月
(11)
Entity Framework Core におけるデータの保存
Moq のインストール
ASP.NET Core で SignalR を使用する
Firefox で英単語を簡単に調べられるアドオン
画像を svg から emf に変換する
Entity Framework Core におけるデータの取得
draw.io で作成した SVG で not supported by viewer と表示される。
dotnet ef コマンドを有効にする
Entity Framework Core におけるリレーションシップについて
Entity Framework Core の基本的な使い方
コマンド "dotnet-ef" に一致する実行可能ファイルが見つかりません
►
2017
(117)
►
12月
(14)
►
11月
(20)
►
10月
(17)
►
9月
(19)
►
8月
(10)
►
7月
(8)
►
6月
(3)
►
5月
(6)
►
4月
(5)
►
3月
(2)
►
2月
(8)
►
1月
(5)
►
2016
(91)
►
12月
(5)
►
11月
(9)
►
10月
(11)
►
9月
(9)
►
8月
(6)
►
7月
(14)
►
6月
(14)
►
5月
(11)
►
4月
(10)
►
3月
(2)
►
2015
(23)
►
12月
(4)
►
11月
(2)
►
10月
(8)
►
9月
(8)
►
7月
(1)
►
2013
(3)
►
11月
(1)
►
9月
(1)
►
7月
(1)
►
2012
(2)
►
7月
(1)
►
6月
(1)
►
2011
(1)
►
9月
(1)
►
2009
(1)
►
7月
(1)
►
2008
(2)
►
11月
(1)
►
7月
(1)
►
2007
(3)
►
10月
(3)