1

我有一个创建用户 ASP.NET MVC 3 页面 - 在页面上有一个多选的汽车框,它是从我的数据库中的 Cars 表中预先填充的。在保存用户时,我返回与用户关联的 CarId 整数列表。我正在使用 WCF 服务和 Entity Framework 5.0 将我的数据返回到 SQL Server 并保存到 SQL Server。

然后我在我的数据库 CarUser 中有一个表 - 它只包含一个用户 ID 和一个客户端 ID - 用户表中的 UserId 和 Cars 表中的 CarId 的两个 FK。

当我创建用户时,它正在更新 CarUser 表正在正确更新(例如 - 它可能看起来像这样)

CarId UserId 2 4 3 4 4 4 5 4

所以它看起来是正确的,因为我的 CarUser 表显示了与从多选框中选择的 4 个 CarId 关联的用户 4。但是我遇到的问题是它正在重新创建汽车表中的汽车 - 例如,它正在创建汽车 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新创建的用户,然后是与用户关联的 carId 列表。

第二种方法的代码如下:

    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();
            }
        }
    }

谁能看到我做错了什么?我在想的另一个选择是把它从实体框架中拿走,然后在 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

你不应该那样设置状态。这就像强奸框架。

Instedad 将模型实例 ( entities) 作为参数发送到读取汽车和用户的方法。(并且 ofc。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 回答