这是一个简单的案例。
我的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使用现有状态而不是尝试重新插入。我真正的问题有很多嵌套对象可能存在,所以我需要解决这个问题。
由于
答案 0 :(得分:2)
我知道的两种方式是:
将EntityState设置为适合您的操作或
从数据库中获取UsState并在保存之前将其添加到客户,这将为其提供UnModified的EntityState或类似的东西。
更改您需要获取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);