我有一个创建用户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中调用存储过程
答案 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();
}
}
这样,实体框架将保持实体状态