更新一个到多个表实体框架

时间:2013-02-07 16:31:40

标签: c# asp.net-mvc-3 linq entity-framework

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

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

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

CarId UserId 2 4 3 4 4 4 5 4

所以看起来正确的是我的CarUser表显示了与从Multi Select框中选择的4个CarIds相关联的User 4。然而我遇到的问题是它正在汽车表中重新创建汽车 - 所以它正在创建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,然后是与用户关联的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();
            }
        }
    }

任何人都能看到我做错的事吗?我正在考虑的另一个选择是从Entity Framework中取出它,只需在CarUserMapping_Create中调用存储过程

2 个答案:

答案 0 :(得分: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();
        }
    }
}

答案 1 :(得分:0)

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

Instedad将模型实例(entities)作为参数发送到读取汽车和用户读取的方法。 (和.c。在方法中使用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();
    }
}

这样,实体框架将保持实体状态