2

アプリケーションに関して問題があり、EF を使用して更新する項目を選択していません。

ユーザーが組織の詳細を入力するためのアプリケーションを作成しています。十分に単純に思えます。タブ コントロールを使用してデータを入力すると、一連のデータ グリッドを含むビューが表示され、ユーザーは必要に応じて別のデータを更新または挿入したり、削除したりできます。

私のビューモデル内には、一連のさまざまなものがあります(MVVMを実装する最良の方法ではないかもしれませんが、最終的にそこに到達しようとしています)。

プロパティを実装していますINOTIFYPROPERTYCHANGE。保存、更新、および削除するコマンド。そして、私のエンティティメソッド(Entity Frameworkを使用したCRUD操作 - MVVMなどについて詳しく学んだときに、後でリポジトリシステムを使用します)。

これまでのところ、ビューのコード ビハインドを使用して、完全に機能するデータをロードする必要があります (明らかに、これを行うべきではないので、そうでないことを示すアドバイスは大歓迎です)。

    private void Page_Loaded(object sender, RoutedEventArgs e)
    {
        DBEntities context = new DBEntities();

        var orgTypeDetails = (from o in context.OrganisationTypeDetails
                              select o).ToList();

        dgOrgTypeDetail.ItemsSource = orgTypeDetails;
    }

また、行を選択してからその特定の行を更新することしかできないイベントハンドラーもあります。

    private void btnUpdateOrgTypeDetail_Click(object sender, RoutedEventArgs e)
    {
        OrganisationTypeDetailViewModel org = new OrganisationTypeDetailViewModel();

        OrganisationTypeDetail selected = dgOrgTypeDetail.SelectedItem as OrganisationTypeDetail;

        if (selected == null)
            MessageBox.Show("You must select a 'Type' before updating.");
        else
        {
            OrganisationTypeDetailUpdateView update = new OrganisationTypeDetailUpdateView();

            update.ShowDialog();
    org.UpdateOrganisationTypeDetail(selected);
            Page_Loaded(null, null);
        }
    }

最後に、View-Model から EF を使用してテーブルを更新する方法。

    public void UpdateOrganisationTypeDetail(OrganisationTypeDetail orgTypeDetail)
    {
        using (DBEntities context = new DBEntities())
        {
            //var orgTD = context.OrganisationTypeDetails.Where(otd => otd.OrganisationTypeDetailID == OrganisationTypeDetailID).FirstOrDefault();

            var orgTD = (from a in context.OrganisationTypeDetails
                         where a.OrganisationTypeDetailID == OrganisationTypeDetailID
                         select a).FirstOrDefault();

            orgTD.OrganisationTypeDetailID = OrganisationTypeDetailID;
            orgTD.OrganisationTypeID = OrganisationTypeID;
            orgTD.Title = Title;
            orgTD.FirstName = FirstName;
            orgTD.Surname = Surname;
            orgTD.Position = Position;
            orgTD.DateOfBirth = DateOfBirth;
            orgTD.Address = Address;
            orgTD.Country = Country;
            orgTD.Postcode = Postcode;
            orgTD.PhoneNumber = PhoneNumber;
            orgTD.MobileNumber = MobileNumber;
            orgTD.FaxNumber = FaxNumber;
            orgTD.Email = Email;
            orgTD.NINumber = NINumber;

            context.OrganisationTypeDetails.ApplyCurrentValues(orgTD);
            context.SaveChanges();

            MessageBox.Show("Updated Organisation Type Details");
        }

このアプリケーションを実行すると、Null Reference exception.

私のプロパティでは、クラッシュしないようにするために、プログラムで ID を設定する必要がありました。 public int _OrganisationTypeDetailID=17; しかし、17 から行を取得するオプションだけではなく、自分の選択で行を選択できるようにしたいと考えています。

Linq と Lamba の両方の式を使用してみましたが、どちらも機能していないようです。

申し訳ありませんが、これを読んで理解することがたくさんあり、必要に応じてコードや説明を追加していただければ幸いです :)。

4

2 に答える 2

1

FirstOrDefaultは、クエリが結果を返さない場合にタイプのデフォルト値を返すため、FirstOrDefaultの後に結果がnullであるかどうかを確認します。

このように見えるはずです

 var orgTD = (from a in context.OrganisationTypeDetails
                         where a.OrganisationTypeDetailID == OrganisationTypeDetailID
                         select a).FirstOrDefault();

 if(orgTD == null)
   return;

確かな場合、そのクエリは少なくとも1つの要素を返します。代わりに、 Firstを使用してください

于 2012-11-28T10:13:24.487 に答える
0

私は、MySQL データベースに接続する MS Visual Studio .NET データ エンティティ モデルを使用して、同様の問題に 2 週間を費やしました。StackOverflow、MySQL、MS のサイト フォーラム、およびヘルプ リソースをよく調べて検索した結果、予想どおり、null 参照エラーに対する答えはかなり単純なものでした。

64 ビットの MySQL サーバーをインストールしましたが、MS Visual Studio はすべて 32 ビットです。app.config にどのような変更を加えても、参照をどのように操作しても、Nuget を介してインストールしたパッケージの数に関係なく、MySQL 64 ビットをアンインストールする以外は問題を解決できませんでした (既存の最初にデータベースをモデルにインポートして、後で再ロードできるようにします)、次に MySQL 32 ビットを再インストールします。データベースを再作成し、データ エンティティ モデルとデータ ソースを再構築した後、null 参照エラーは解決されました。

SO... MS Visual Studio で MySQL を使用している場合は、32 ビットの MySQL 製品を使用していることを確認してください。

(結果に影響したかどうかにかかわらず、私が行ったもう 1 つのことは、Windows IIS をインストールして localHost にアクセスすることでした。ただし、これは実際の問題から気をそらすだけだと思う​​ので、これは最後の手段として追加するだけです)。

于 2013-12-13T14:41:14.670 に答える