客户类:
class Customer
{
int id;
int phone;
int fax;
PhoneNumber phone1;
PhoneNumber fax1;
}
Class PhoneNumber
{
int id;
int prefixid;
string number;
}
PhoneNumber由EF4自动生成,我已将自动生成的名称更改为phone1和fax1
phonenumber id和customer id都是DB中的标识列。
现在我想创建一个新客户:
var newCustomer = Customer.CreateCustomer(0, CompanyID);
PhoneNumber fax = new PhoneNumber();
PhoneNumber phone = new PhoneNumber();
fax.Customers.Add(newCustomer);
phone.Customers.Add(newCustomer);
context.Customers.AddObject(newCustomer);
context.SaveChanges();
但现在我明白了:
System.Data.UpdateException:{“不能 为身份插入显式值 表'PhoneNumber'中的列 IDENTITY_INSERT设置为OFF。“}
为什么EF4不处理相关表的标识列,因为它应该处理新实体?我怎样才能做到这一点?
(EF4应该在Phones表中创建2个entiries,获取他们的身份并将其添加到新客户的客户行 - 至少是我想做的事情)
我知道我可以创建2个电话记录,而不是创建客户记录,但
一个。我希望它能在一个行为中完成。
湾如果cusotmer创建失败 - 我不希望电话表上有空记录......
答案 0 :(得分:1)
这两件事情相互矛盾:
phonenumber id和customer id都是DB中的标识列。
然后是错误:
System.Data.UpdateException:{“当IDENTITY_INSERT设置为OFF时,无法在表'PhoneNumber'中为标识列插入显式值。”}
看起来这个错误似乎是说正在设置重复的身份,但事实并非如此 - 它说你试图明确设置身份字段。
这就是说PhoneNumber中的ID列不是标识字段。或者至少EF认为不是。
所以我有四个问题:
1)您是否确认EDMX中的字段设置为IDENTITY?也许有些东西覆盖了它?
2)CreateCustomer
方法有什么作用?它只是新客户并设置了一些属性吗?它不应该触及身份字段。
3)您是否在EDMX上正确设置了导航属性/基数?例如1客户...... 1- *电话号码。
4)尝试将电话号码添加到客户,而不是相反。将“many”添加到“one”是有意义的 - 例如,Customer就是这里的聚合:
var newCustomer = Customer.CreateCustomer(0, CompanyID);
newCustomer.phone1 = new PhoneNumber();
newCustomer.fax1 = new PhoneNumber();
context.Customers.AddObject(newCustomer);
context.SaveChanges();
我还建议重新设计你的模型。
让客户拥有1个传真和1个电话号码是很愚蠢的,每个都有一个属性。它应该是一个客户拥有许多“PhoneNumber”实体。
您可以在PhoneNumber实体上使用TPH来区分传真和其他类型,上面的代码会更有意义:
var newCustomer = Customer.CreateCustomer(0, CompanyID);
newCustomer.Phones.Add(new FaxNumber());
newCustomer.Phones.Add(new MobileNumber());
context.SaveChanges();