我有一个创建用户 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 中调用一个存储过程