1

EF4 Self Tracking Entities (VS2010 Beta 2 CTP 2 と新しい T4 ジェネレーター) を使用しています。しかし、エンティティ情報を更新しようとすると、期待どおりにデータベースに更新されません。

2 つのサービス コールをセットアップします。1 つはリソース オブジェクトを返す GetResource(int id) 用です。2 番目の呼び出しは SaveResource(Resource res) です。これがコードです。

    public Resource GetResource(int id)
    {
        using (var dc = new MyEntities())
        {
            return dc.Resources.Where(d => d.ResourceId == id).SingleOrDefault();
        }        
    }

    public void SaveResource(Resource res)
    {
        using (var dc = new MyEntities())
        {
            dc.Resources.ApplyChanges(res);
            dc.SaveChanges();
            // Nothing save to database.
        }      
    }

    //Windows Console Client Calls
    var res = service.GetResource(1);
    res.Description = "New Change"; // Not updating...
    service.SaveResource(res); 

    // does not change anything.

ChangeTracker.State は常に「Unchanged」と表示されるようです。

このコードに何か問題がありますか?

4

5 に答える 5

3

これはおそらくロングショットです...しかし:

あなたのサービスは実際には別の層にあると思いますか?同じ層でテストしている場合は、問題が発生します。

自己追跡エンティティ(STE)は、ObjectContextに接続されるまで変更を記録しません。つまり、ObjectContextに接続されている場合は、変更を記録でき、同じ作業を2回行う意味はありません。

STEは、WCFを使用してクライアントで逆シリアル化されると、つまりObjectContextのない層に実体化されると、追跡を開始します。

生成されたコードを調べると、手動で追跡をオンにする方法もわかるはずです。

お役に立てれば

アレックス

于 2010-01-30T07:11:38.373 に答える
1

クライアントとサービスの間で STE とアセンブリを共有する必要があります。これが要点です。次に、サービス参照を追加するときに、「参照されたアセンブリで型を再利用する」がチェックされていることを確認してください。

これは、STE には「サービス参照の追加」では転送できないロジックが含まれているため、これらのタイプを共有して、クライアントにもトレース ロジックを持たせる必要があるためです。

于 2011-01-09T14:13:27.417 に答える
0

私はまったく同じ問題を抱えていて、解決策を見つけました。

自己追跡エンティティが自動的に追跡を開始するには、サービス参照を追加する前にSTEプロジェクトを参照する必要があるようです。

このようにして、VisualStudioは最後のトリックを実行するいくつかの.datasourceファイルを生成します。

私はここで解決策を見つけました:http: //blogs.u2u.be/diederik/post/2010/05/18/Self-Tracking-Entities-with-Validation-and-Tracking-State-Change-Notification.aspx

手動で追跡を開始することに関しては、クライアント側にこれらのメソッドがないようです。

それが役に立てば幸い...

于 2011-11-09T09:50:34.037 に答える
0

WCF なしで STE を使用している場合は、StartTracking() を手動で呼び出す必要がある場合があります。

于 2010-03-23T18:22:56.167 に答える
0

Daniel Simmons からの次のヒントを読んだ後、STE は追跡を開始します。記事全文へのリンクはこちらです。http://msdn.microsoft.com/en-us/magazine/ee335715.aspx

Self-Tracking Entity テンプレートの生成されたエンティティ コードをクライアントで再利用するようにしてください。 Visual Studio またはその他のツールで [サービス参照の追加] によって生成されたプロキシ コードを使用すると、ほとんどの場合は問題ないように見えますが、エンティティが実際にはクライアントでの変更を追跡していないことがわかります。

そのため、クライアントでは、サービス参照の追加を使用してプロキシを取得しないでください。代わりに、次のコードを使用してサービスにアクセスしてください。

var svc = new ChannelFactory<IMyService>("BasicHttpBinding_IMyService").CreateChannel();
var res = svc.GetResource(1);
于 2010-02-01T22:51:40.973 に答える