0

在我当前的项目(非常小)中,我有 3 个表/ POCO 实体,我想使用 EF 进行操作。

这些表格是:

  1. 状态(包含状态详细信息)
  2. StatusStatusType(由于多对多关系而需要)
  3. StatusType(用于按类型对状态进行分组的表)

我现在想在数据库和用户代码中创建一个新状态,如下所示

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

此代码工作正常,但我还想设置状态实体的StatusType。所有可能的状态类型都已包含在StatusType表中。我不想创建新状态只创建一个参考。

我想我应该使用类似的东西:

status.StatusTypes == "new";

更新 22-04-2012 13:31

该示例经过简化并跨越解决方案中的多个项目。因此,我不喜欢在创建部分中使用代码(例如 demoEntities)。但是我知道我需要参考的状态的 PK。

4

1 回答 1

2

如果您知道您的状态类型已经存在,那么您现在还必须使用它的主键。一旦你有一个主键值,你可以使用这种方法:

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();
}
于 2012-04-22T10:13:25.437 回答