EntityFrameworkのデータファーストでモデルクラスをINotifyPropertyChangedに対応させる
EntityFrameworkサイコー
EFのデータファーストが最高なので、INotifyPropertyChanged
に対応したらもっとサイコーになるよね。
的な。
INotifyPropertyChanged の実装超めんどい
なのでハイパー最高なNuGetのPropertyChanged.Fodyを使う。
INotifyPropertyChangedを自動実装してくれるPropertyChanged.fodyが超便利 - Azureはじめました
上の記事はPropertyChanged.Fody
のかなり古いバージョンなので今この通りに実装するとそんな古い形式使ってんじゃねーよばーかばーか
的なエラーになるので注意。
NotifyPropertyChanged.Fodyの実装方法
public class HogeModel{
public string Name{get;set;}
public int AnyNumber{get;set;}
}
これを
using System.ComponentModel;
public class HogeModel{
public event PropertyChangedEventHandler PropertyChanged;
public string Name{get;set;}
public int AnyNumber{get;set;}
}
こうする。
後はプロジェクトにFodyWeavers.xml
というファイルを追加して
<?xml version="1.0" encoding="utf-8" ?>
<Weavers>
<PropertyChanged/>
</Weavers>
こうするだけ。超便利。
INotifyPr(略) をedmx で出力しているクラスにどう実装するか
edmxを構成するモデル出力用のT4テンプレートを直接編集すればOK
PropertyChanged.Fodyで追加する記述は
- usingに
System.ComponentModel
を追加 - class定義に
INotifyPropertyChanged
を追加 - メンバに
PropertyChangedEventHandler
を追加
なのでそれぞれ追記する。
1. usingにSystem.ComponentModel
を追加
usingを出力しているのは codeStringGenerator.UsingDirectives()
なのでそこに追記
public string UsingDirectives(bool inHeader, bool includeCollections = true)
{
return inHeader == string.IsNullOrEmpty(_code.VsNamespaceSuggestion())
? string.Format(
CultureInfo.InvariantCulture,
"{0}using System;{1}" +
"{2}",
inHeader ? Environment.NewLine : "",
(includeCollections ? (Environment.NewLine + "using System.Collections.Generic;") : "")
+Environment.NewLine +"using System.ComponentModel;", //これ
inHeader ? "" : Environment.NewLine)
: "";
}
2. class定義にINotifyPropertyChanged
を追加
class定義を出力してるのはcodeStringGenerator.EntityClassOpening()
public string EntityClassOpening(EntityType entity)
{
return string.Format(
CultureInfo.InvariantCulture,
"{0} {1}partial class {2}{3}",
Accessibility.ForType(entity),
_code.SpaceAfter(_code.AbstractOption(entity)),
_code.Escape(entity),
":INotifyPropertyChanged"); //これ
//_code.StringBefore(" : ", _typeMapper.GetTypeName(entity.BaseType)));
}
(entity.BaseType使わないので横着した。使う場合は適宜修正を。)
3. メンバに PropertyChangedEventHandler
を追加
テンプレートの先頭の方にあるEntityClassOpening(entity)
の後に直接記述
<#=codeStringGenerator.UsingDirectives(inHeader: false)#>
<#=codeStringGenerator.EntityClassOpening(entity)#>
{
#pragma warning disable 0067
public event PropertyChangedEventHandler PropertyChanged; //これ
#pragma warning restore 0067
ただPropertyChangedEventHandler
を追加しただけだと CS0067(未使用のメンバ)が表示されて大変鬱陶しいのでpragma warning disable - restore
を使って警告表示を抑制してみた。
あとはファイルを保存してコンパイルすればOK。
こんな感じに出力される。
//------------------------------------------------------------------------------
// <auto-generated>
// このコードはテンプレートから生成されました。
//
// このファイルを手動で変更すると、アプリケーションで予期しない動作が発生する可能性があります。
// このファイルに対する手動の変更は、コードが再生成されると上書きされます。
// </auto-generated>
//------------------------------------------------------------------------------
namespace models
{
using System;
using System.Collections.Generic;
using System.ComponentModel;
public partial class 銀行マスタ:INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
[Key]
public string 銀行コード { get; set; }
public string 銀行名 { get; set; }
public string 銀行カナ { get; set; }
}
}
いいね!
使いみちとか
INotifyPropertyChanged
吐けばWinFormsのDataBindingとかWPFのBindingとかが勝手にリセットしてくれるので、ViewModel的に使ったりマジなんでもありでサイコー。
Author And Source
この問題について(EntityFrameworkのデータファーストでモデルクラスをINotifyPropertyChangedに対応させる), 我々は、より多くの情報をここで見つけました https://qiita.com/qyen/items/48d0c170b241a7d85d06著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .