使用Entity Framework代码优先,如何使用现有属性插入对象

时间:2012-01-15 01:00:58

标签: entity-framework entity-framework-4.1 ef-code-first code-first

这是一个简单的案例。

我的Customer记录定义如下:

 public class Customer
   {
      [Key]
      public string Id { get;}
      public UsState UsState { get; set; }
   }

 public class UsState
   {
      [Key]
      public string  StateAbbreviation {get;set;}
      public string  StateName {get;set;}
   }

我已经将我的UsState填充了50个状态,现在我想插入一个与现有状态相关联的Customer记录。

如果我说的话:

Customer customer = new Customer() 
             {
                UsState = "CA",
                Id = 1001
             }
dbContext.Customers.add(customer);

我收到一条错误消息,指示状态正在尝试重新插入。

如何让add使用现有状态而不是尝试重新插入。我真正的问题有很多嵌套对象可能存在,所以我需要解决这个问题。

由于

2 个答案:

答案 0 :(得分:2)

我知道的两种方式是:

  1. 将EntityState设置为适合您的操作或

  2. 从数据库中获取UsState并在保存之前将其添加到客户,这将为其提供UnModified的EntityState或类似的东西。

  3. 更改您需要获取DbContext的ObjectContext的EntityState,如此主题所示:Entity Framework Code First - No Detach() method on DbContext

答案 1 :(得分:0)

如果从表数据的角度考虑这一点,您的Customer表中应该有一个描述客户状态的列。您还可以使用状态表连接在一起以获取州名称。

CREATE TABLE customer (
    id  VARCHAR(10),
    state CHAR(2)
)

CREATE TABLE state (
    stateabbreviation CHAR(2),
    statename VARCHAR(50)
)

“state”列只是表示状态的字符串。因此,您的类应该以相同的方式定义,使用ID和State,如果要包含USState类的信息,请定义一个类型为UsState的属性,并定义ForeignKey:

public class Customer
{
    [Key]
    public string Id { get;}
    public string State { get; set; }
    [ForeignKey("State")]
    public UsState UsState { get; set; }
}

然后,当您创建新记录时,请设置字符串的文本,而不是UsState对象。

Customer customer = new Customer() 
{
    State = "CA",
    Id = 1001
}
dbContext.Customers.add(customer);