Entity Framework – View Issue #171: EdmGen: Error using EdmGen 4.0 with Oracle11g DAC (Win 7 x64)
参考:IISマネージャーからアプリケーションインポートしたら、アプリケーションプールのエラーが出た – minato128のブログ
まさにこれ。
- msdeployはデプロイ先のアプリケーションプールの.NETバージョンとデプロイ対象アプリのバージョンが一致しているかチェックする
- IISに4.5をインストールしていたとしても、設定できるのはv4.0
- VS2010のtargetは4.5に対応していないのか、この状況ではエラーを吐いてデプロイできない
使用しようとしているアプリケーション プールでは、’managedRuntimeVersion’ プロパティが ‘v4.0’ に設定されています。このアプリケーションには ‘v4.5’ が必要です。
- /t:Packageでデプロイパッケージを作る際のmsbuildオプションに
/p:VisualStudioVersion=11.0
(2013は12.0なのかな?)をつければVS2012のtargetを使用するようになるらしく、エラーを吐かずに正常にデプロイ出来るようになる
ODACの11g、12cにはOracle.ManagedDataAccessというのが追加されており、ネイティブコードが無くなったのでサーバー環境へのデプロイ時にODP.NETやOracleClientのインストールが不要になる!ということで、やり方を調べてみたメモ。
これのBのパターンでうまく行った。
- WCFサービスのホストプロジェクトなどDB接続が必要になるプロジェクトの参照にEntityFramewrokとOracle.ManagedDataAccessを追加し、ローカルコピーをTrueに
- Web.config/App.configを以下のように設定
[/xml]
- 適当にデプロイ
Oracle.ManagedDataAccessDTC.dll が必要な場合
- TransactionScope を使う場合など、Oracle.ManagedDataAccessDTC.dll が必要な時がある
- 無いと実行時に
FileNotFoundException
で死ぬ
- 無いと実行時に
- Oracle.ManagedDataAccess.dllと同様に、実行パスかGACに入ってればOK
- Microsoft Visual C++ 2010 SP1 再頒布可能パッケージ を必要とする点に注意 (SP1じゃなくても大丈夫だとは思うが…)
- これも同様に、インストールされていないと実行時に
FileNotFoundException
で死ぬ
- これも同様に、インストールされていないと実行時に
- Oracle.ManagedDataAccessDTC.dll も Microsoft Visual C++ 2010 SP1 再頒布可能パッケージ も32bit版と64bit版があるので、実行環境に合わせたものを使おう
アニメ版はちょっとなー原作版出ないかなーと思ってたところに出てくれました。
某イベント時に作られたもので当初通販もあったのですが、昼から開始されたのに夜にはもう無くなっていて、買えなかった記憶…
その後受注再販があったため、喜んで購入した次第。
九尾なのに珍しくロリじゃない!
人気投票2位のキャラが出たのはファム以来でしょうか。
作品別では初めてですね。。
もっと出しても良いのよ?リグレットとか。
DbContextでの話。
普通はDbContextから取得したデータを更新すれば良い。
[csharp]
using (var context = new Entities())
{
var hoge= context.Hoge.Find(“id的な”);
hoge.Fuga = “New!”;
context.SaveChanges();
}
[/csharp]
これはDbContextに変更追跡機能があるため可能な事。
DbContextのライフサイクル外から受け取ったEntityオブジェクトなんかはただのPOCOであり、どう変更されたかなんてDbContextは知らない。
DataSetなんかは、DataTable自体が変更追跡機能持っててシリアライズもできたのだけど…
自己追跡エンティティ(STE)なんかもあるけど、Not Recommendedとされているし、EF6やVS2013ではもう使えない。
EF4から導入されたばかりなのに短い寿命でしたね…
んで、WCFなんかで外部から受け取ったデータは当然変更追跡の対象外なため、Attachとかしないとダメなことは想像付く。
でもAttachしただけではUnchangedな状態なので、変更してくれない。
ではどうすれば良いかというと、どうやらModified状態に変更してしまえば勝手に更新してくれるようだ。
[csharp]
public void Update(Hoge hoge){
using (var context = new Entities())
{
context.Hoge.Attach(hoge);
context.Entry(hoge).State = EntityState.Modified;
context.SaveChanges();
}
}
[/csharp]
削除はAttachしてからRemoveすればOK。
[csharp]
public void Remove(Hoge hoge){
using (var context = new Entities())
{
context.Hoge.Attach(hoge);
context.Hoge.Remove(hoge);
context.SaveChanges();
}
}
[/csharp]
ちなみにナビゲーションプロパティでIncludeされてる関連オブジェクトがある場合で、外部キーの値を変更したのに、関連オブジェクトは変更前のままとかいう場合、Attachすると死ぬ。
[csharp]
//どっかで読み込んだ
context.Hoge
.AsNoTracking()
.Include(x => x.Piyo)
;
[/csharp]
[csharp]
//どっかで外部参照のキー値を更新した
hoge.PiyoId = “new id”; //※hoge.Piyoは変更前のまま
[/csharp]
[csharp]
//そのままAttachすると死ぬ
context.Hoge.Attach(hoge);
[/csharp]
この場合、どうやらナビゲーションプロパティをnullにしてしまえばAttachできる。
関連オブジェクトを再取得してきてちゃんと値を合わせてやってもうまくいくんじゃないかな?(試してない
[csharp]
hoge.Piyo = null;
//これなら大丈夫。取得時にIncludeしてないのと同じ状態になる。
context.Hoge.Attach(hoge);
[/csharp]
潜水艦Lv
タイミング | 出撃回数 | イムヤLv | ゴーヤLv |
---|---|---|---|
E4開始 | 0 | 20 | 0 |
ゴーヤドロップ | 76 | 58 | 0 |
E4クリア | 181 | 72 | 63 |
飽きた | 301 | 84 | 77 |
ボス到達率
- トータル:66.78%
- E4クリア以降:75.00%
戦闘評価
トータル
評価 | 数 |
---|---|
S | 2 |
A | 7 |
B | 742 |
C | 65 |
D | 186 |
合計 | 1002 |
勝率 | 74.95% |
E4クリア後
評価 | 数 |
---|---|
S | 0 |
A | 1 |
B | 346 |
C | 31 |
D | 48 |
合計 | 426 |
勝率 | 81.46% |