gpt4 book ai didi

c# - EF 4 中的标识列

转载 作者:太空狗 更新时间:2023-10-29 20:57:36 24 4
gpt4 key购买 nike

我遵循 Entity Framework 示例:

http://msdn.microsoft.com/en-us/library/bb399182.aspx

我对标识列有疑问。

下面是创建数据库的部分代码:

CREATE TABLE [dbo].[Person](
[PersonID] [int] IDENTITY(1,1) NOT NULL,
[LastName] [nvarchar](50) NOT NULL,
[FirstName] [nvarchar](50) NOT NULL,
[HireDate] [datetime] NULL,
[EnrollmentDate] [datetime] NULL,
CONSTRAINT [PK_School.Student] PRIMARY KEY CLUSTERED
(
[PersonID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
END
GO

在 VS 2010 中,我构建了 .edmx,在模型中,我看到 Person StoreGeneratedPattern 设置为 Identity。

但是当我想创建 Person 时,通过: alt text

如果此列是自增的,为什么我必须输入 id?

编辑

我认为我找到了解决问题的方法:

var schoolContext = new SchoolEntities();

schoolContext.AddToPeople(new Person() { LastName = "Gates", FirstName = "Bil" });

schoolContext.SaveChanges();

因为它将 Bill 添加到 persons,但是...因为 PersonID 不可为 null,并且它用 id 0 插入了他。当我尝试以相同的方式添加另一个人时,当然我得到关于主键的错误 :)

还是一无所有...

有什么想法吗?

最佳答案

IMO 即使生成了 Id 也是需要的。假设您正在使用外键关联(不同于独立关联的行为)。这意味着相关的子实体正在使用父实体的主键来建立关系。现在假设您要在单个工作单元中添加多个具有相关实体的父实体。您必须为每个父实体指定唯一(临时)ID,否则您将永远不会配置对象图。所以代码生成器可能将其设为默认值。

编辑:

令我惊讶的是,根据正确的事实,我的回答被否决了。那么让我澄清一下我的答案:

EF 4.0 中有两种类型的关系可用。独立关联和外键关联。不同之处在于后者为实体添加了外键属性。这允许您以与在数据库中相同的方式处理关系 - 只需设置键即可。您可以在 MSDN 中了解这些差异.

现在让我们假设一个简单的例子。我有带有 MyContext 的简单 EDMX 模型。模型由两个实体Order 和OrderLine 组成。当我将 Orders 和 OrderLines 表添加到模型时,我加厚了在模型中包含外键列,因此我使用外键关联而不是独立关联。

Order 将存储生成的 Id 作为键,将 CustomerName 作为属性。订单行将存储生成的 Id 作为键,ProductTitle 作为属性,OrderId 作为外键。我想在单个工作单元中添加两个订单:

using (var context = new MyContext())
{
var ox = Order.CreateOrder(0, "CustomerX");
var oy = Order.CreateOrder(0, "CustomerY");

// Building relationship in the same way as in database
var olx = OrderLine.CreateOrderLine(0, ox.Id, "ProductX");
var oly = OrderLine.CreateOrderLine(0, oy.Id, "ProductY");

context.Orders.AddObject(ox);
context.Orders.AddObject(oy);
context.OrderLines.AddObject(olx);
context.OrderLines.AddObject(oly);
context.SaveChanges(); // UpdateException: Unable determine principal end of Model.FK_OrderLine_Order relationship. Multiple added entities have the same primary key.
}

我在代码中犯的错误是将两个新订单的 ID 都设置为 0。即使这是临时 ID,如果您想将它用于外键,它仍然必须是唯一的。你现在可能会问为什么上下文不自己处理 Id ?很简单,因为它不能。上下文知道 Id 是临时的,将在商店中重新生成,但上下文不知道有关商店配置的详细信息。当您在数据库中设置身份时,您还设置了种子和增量。上下文不知道这两个值,因此上下文无法派生出商店尚未使用的有效唯一临时 Id。假设上下文错误地创建了一些临时 Id,然后你加载了已经使用这个 Id = 问题的实体。

如果我简单地更新我的代码以使用唯一的临时 ID(我知道商店是如何配置的)它就会工作。这就是我需要为 Create 方法提供临时 Id 的原因之一。

关于c# - EF 4 中的标识列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3641997/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com