使用标识列插入与新对象相关的新对象

时间:2011-01-02 14:18:19

标签: entity-framework-4

客户类:

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创建失败 - 我不希望电话表上有空记录......

1 个答案:

答案 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();