当我运行下面所述的代码时,EF会将
我的问题是:即使我没有指定它所属的实体,EF是否自动添加相关实体?如果是,这不会导致不必要的实体关系吗?
更新
出于以下原因,似乎实体已被正确保存:
因此,从技术上讲,EF并未自动添加相关实体,它们是相关的,因为它们共享相同的
请参考以下代码:
当我把额外的
代码:
作为错误指定的,Entity Framework 现在无法确定
我可以通过以下修改代码来解决这个问题:
请看下面的EDMX: 请看用于创建这两个表的SQL脚本:
请查看下面的Id列截图: 请看下面的SQL Server Profiler跟踪: :
:
:
请查看在SQL中插入的记录: :
:
谢谢。
PersonAddress
与正确的PersonId
保存。虽然我没有将PersonAddress
实体添加到Person
实体中,但我的数据库记录已经正确关联。我的问题是:即使我没有指定它所属的实体,EF是否自动添加相关实体?如果是,这不会导致不必要的实体关系吗?
更新
出于以下原因,似乎实体已被正确保存:
- 创建实体
Person
时,PersonId
字段为0 PersonAddress.PersonId
在创建时也为0。
Person.PersonId
为任何值,然后将PersonAddress.PersonId
设置为相同值的Person.PersonId
,EF将数据保存正确,因为它们共享相同的PersonId
。因此,从技术上讲,EF并未自动添加相关实体,它们是相关的,因为它们共享相同的
PersonId
。请参考以下代码:
using (var context = new Models.TestEntities())
{
var person = context.People.Create();
var postalAddress = context.PersonAddresses.Create();
postalAddress.AddressLine1 = "PostalAddressLine1";
var residentialAddress = context.PersonAddresses.Create();
residentialAddress.AddressLine1 = "ResidentialAddressLine1";
context.People.Add(person);
context.PersonAddresses.Add(postalAddress);
context.PersonAddresses.Add(residentialAddress);
context.SaveChanges();
}
当我把额外的
Person
添加到代码中时,我遇到了以下错误:
代码:
using (var context = new Models.TestEntities())
{
var person = context.People.Create();
var person2 = context.People.Create();
var postalAddress = context.PersonAddresses.Create();
postalAddress.AddressLine1 = "PostalAddressLine1";
var residentialAddress = context.PersonAddresses.Create();
residentialAddress.AddressLine1 = "ResidentialAddressLine1";
context.People.Add(person);
context.People.Add(person2);
context.PersonAddresses.Add(postalAddress);
context.PersonAddresses.Add(residentialAddress);
context.SaveChanges();
}
作为错误指定的,Entity Framework 现在无法确定
PersonAddress
实体属于哪个人。我可以通过以下修改代码来解决这个问题:
using (var context = new Models.TestEntities())
{
var person = context.People.Create();
var person2 = context.People.Create();
var postalAddress = context.PersonAddresses.Create();
postalAddress.AddressLine1 = "PostalAddressLine1";
var residentialAddress = context.PersonAddresses.Create();
residentialAddress.AddressLine1 = "ResidentialAddressLine1";
context.People.Add(person);
context.People.Add(person2);
person.PersonAddresses.Add(residentialAddress);
person.PersonAddresses.Add(postalAddress);
context.SaveChanges();
}
请看下面的EDMX: 请看用于创建这两个表的SQL脚本:
CREATE TABLE Person
(
PersonId INT IDENTITY(1,1) NOT NULL CONSTRAINT [PK_Person] PRIMARY KEY,
FirstName VARCHAR(250)
)
CREATE TABLE PersonAddress
(
PersonAddressId INT IDENTITY(1,1) NOT NULL CONSTRAINT [PK_PersonAddress] PRIMARY KEY,
PersonId INT NOT NULL,
AddressLine1 VARCHAR(250)
)
ALTER TABLE PersonAddress
ADD CONSTRAINT [FK_PersonAddress_Person] FOREIGN KEY(PersonId)
REFERENCES [Person](PersonId)
请查看下面的Id列截图: 请看下面的SQL Server Profiler跟踪: :
:
:
请查看在SQL中插入的记录: :
:
谢谢。
DbUpdateException
)。 - Jenish Rabadiyaperson.PersonAddresses.Add
而不是context.PersonAddresses.Add(
- Tjaart van der Walt