1

ユーザー ASP.NET MVC 3 ページの作成があります。このページには、DB の Cars テーブルから事前設定された車の複数選択ボックスがあります。ユーザーを保存すると、ユーザーが関連付けられている CarId の int のリストが返されます。WCF サービスと Entity Framework 5.0 を使用して、データを SQL Server に戻し、SQL サーバーに保存しています。

次に、DB CarUser にテーブルを作成します。これには、ユーザー ID とクライアント ID だけが含まれます。User テーブルの UserId と Cars テーブルの CarId に対する 2 つの FK です。

ユーザーを作成すると、更新中の CarUser テーブルが正しく更新されます (たとえば、次のようになります)。

CarId UserId 2 4 3 4 4 4 5 4

したがって、CarUser テーブルには、Multi Select ボックスから選択された 4 つの CarId に関連付けられた User 4 が表示されているという点で正しく見えます。ただし、私が抱えている問題は、cars テーブルで Cars を再作成していることです。たとえば、Car Id 9,10,11,12 を作成していますが、それらの詳細は 2,3,4 とまったく同じです。 ,5

このために私が書いたコードは以下のとおりです。

    public User User_Create(User user, List<int> carIds)
    {
        DAL.CarUserWCFFServiceImpl carUser = new DAL.CarUserWCFFServiceImpl();

        // cal the DAL layer to do the create
        User newUser = carUser.User_Create(user);

        //call the DAL layer to create the cars linked to a user
        carUser.CarUserMapping_Create(newUser.UserID, carIds);

したがって、最初のDALメソッド(このコードがリストされているレイヤーの下のレイヤー)の呼び出しによりユーザーが作成されます-次に、ユーザーを取得したら、IDなどを取得して、DALレイヤーで別のメソッドを呼び出し、UserIDを渡します新しく作成されたユーザーと、そのユーザーに関連付けられた carIds のリスト。

2番目の方法のコードは次のとおりです。

    public void CarUserMapping_Create(int userId, List<int> carIds)
    {
        using (CUEntities entities = new CUEntities())
        {
            User user = User_GetById(userId);
            entities.Users.Attach(userId);

            foreach (int carId in carIds)
            {
                Car car = Car_GetById(carId);

                user.Cars.Add(car);
                entities.ObjectStateManager.ChangeObjectState(user, System.Data.EntityState.Modified);
                entities.SaveChanges();
            }
        }
    }

誰かが私が間違っていることを見ることができますか? 私が考えている他のオプションは、これをEntity Frameworkから取り除き、CarUserMapping_Createでストアドプロシージャを呼び出すだけです

4

2 に答える 2

0

たぶん、次のことを追加する必要があります。

public void CarUserMapping_Create(int userId, List<int> carIds)
{
    using (CUEntities entities = new CUEntities())
    {
        User user = User_GetById(userId);
        entities.Users.Attach(userId);

        foreach (int carId in carIds)
        {
            Car car = Car_GetById(carId);
            car.UserID = user.UserID;
            entities.Entry(car).State = EntityState.Modified;
            entities.SaveChanges();
        }
    }
}
于 2013-02-07T18:15:07.847 に答える
0

そのような状態を設定しないでください。それはフレームワークをレイプするようなものです。

代わりに、モデル インスタンス ( entities) をパラメーターとして、車とユーザーを読み取るメソッドに送信します。(そしてentities、メソッドで ObjectContext として使用します) 次のようにします。

using (CUEntities entities = new CUEntities())
{
    User user = User_GetById(entities , userId);


    foreach (int carId in carIds)
    {
        Car car = Car_GetById(entities, carId);
        car.UserID = user.UserID;
        entities.SaveChanges();
    }
}

そうすれば、エンティティ フレームワークはエンティティの状態を追跡します。

于 2013-02-08T09:03:27.550 に答える