在我当前的项目(真的很小)中,我想使用 EF 操作 3 个表/POCO 实体。
这些表是:
- 状态
- (包含状态详细信息)
- StatusStatusType(由于多-2-多关系而需要) 状态类型
- (用于按类型对状态进行分组的表)
我现在想在数据库和用户代码中创建一个新的状态,如下所示
//Create new status (POCO) entity
var newStatus = new Status {
StatusId = status.Id,
UserId = user.Id,
Text = status.text,
CreateDate = DateTime.Now
};
// Persist need status to database
using (var db = new demoEntities())
{
db.Statuses.AddObject(newStatus);
db.SaveChanges();
}
这段代码工作正常,但我还想设置状态实体的状态类型。所有可能的状态类型都已包含在"状态类型"表中。我不想创建新状态,只想创建一个参考。
我想我应该使用类似的东西:
status.StatusTypes == "new";
更新 22-04-2012 13:31
该示例经过简化,并跨越解决方案中的多个项目。因此,我不喜欢在创建部分中使用代码(例如demoEntities)。但是,我确实知道我需要参考的状态的PK。
如果您知道您的状态类型已经存在,您现在也必须使用其主键。获得主键值后,可以使用此方法:
var newStatus = new Status {
StatusId = status.Id,
UserId = user.Id,
Text = status.text,
CreateDate = DateTime.Now
};
// Just dummy object for existing status type
var existingStatusType = new StatusType {
Id = existingStatusTypeId
};
// Persist need status to database
using (var db = new demoEntities())
{
db.Statuses.AddObject(newStatus);
// First let EF know that the status type already exists
// Attaching prior to making relation is important!
db.StatusTypes.Attach(existingStatusType);
// Now make relation between new and existing entity
newStatus.StatusTypes.Add(existingStatusType);
db.SaveChanges();
}
如果您不想在持久性代码中创建关系,则必须使用稍微不同的方法。
var newStatus = new Status {
StatusId = status.Id,
UserId = user.Id,
Text = status.text,
CreateDate = DateTime.Now
};
// Just dummy object for existing status type
var existingStatusType = new StatusType {
Id = existingStatusTypeId
};
newStatus.StatusTypes.Add(existingStatusType);
// Persist need status to database
using (var db = new demoEntities())
{
// This will add both newStatus and existingStatusType as new entities
db.Statuses.AddObject(newStatus);
// You must fix it to make sure that existingStatusType is not inserted
// to database again
status.StatusTypes.ForEach(st =>
db.ObjectStateManager.ChangeObjectState(st, EntityState.Unchanged));
db.SaveChanges();
}