Entity Framework 7 RC1 添加嵌套子实体导致映射错误
Entity Framework 7 RC1 adding nested child entities results in wrong mapping
通过 Entity Framework 7(候选版本 1)添加(中等)大量嵌套子实体会存储错误的实体->子实体映射。
重现问题的简化示例:
using (TestContext dbContext = new TestContext())
{
var nums = Enumerable.Range(1, 40);
var orders = nums.Select(s => new TestOrder()
{
name = s.ToString(),
TestOrderItem = nums.Take(10).Select(o => new TestOrderItem()
{
name = (s*100 + o).ToString(),
TestOrderPricing =
new[] {new TestOrderPricing() {amount = (s*100 + o), PricingType = "Principal"}}.ToList()
}).ToList()
});
dbContext.AddRange(orders);
dbContext.SaveChanges();
}
执行后,所有关系都被存储 - 但大多数 TestPricing 实体引用了错误的 TestOrderItem 实体。
这是 Entity Framework RC1 的现有错误还是我的设置有误?
测试环境设置:
- Visual Studio 2015
- DNX 4.6
- EF7 RC1
1) 数据库优先 - 创建 3 个表:
CREATE TABLE [dbo].[TestOrder](
[OrderId] [int] IDENTITY(1,1) NOT NULL,
[name] [varchar](100) NULL,
CONSTRAINT [PK_Order] PRIMARY KEY CLUSTERED
(
[OrderId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
CREATE TABLE [dbo].[TestOrderItem](
[OrderItemId] [int] IDENTITY(1,1) NOT NULL,
[OrderId] [int] NOT NULL,
[name] [varchar](100) NULL,
CONSTRAINT [PK_OrderItem] PRIMARY KEY CLUSTERED
(
[OrderItemId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
CREATE TABLE [dbo].[TestOrderPricing](
[OrderItemId] [int] NOT NULL,
[PricingType] [varchar](20) NOT NULL,
[amount] [decimal](18, 2) NULL,
CONSTRAINT [PK_OrderPricing] PRIMARY KEY CLUSTERED
(
[OrderItemId] ASC,
[PricingType] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
ALTER TABLE [dbo].[TestOrderItem] WITH CHECK ADD CONSTRAINT [FK_OrderItem_Order] FOREIGN KEY([OrderId])
REFERENCES [dbo].[TestOrder] ([OrderId])
ON DELETE CASCADE
ALTER TABLE [dbo].[TestOrderItem] CHECK CONSTRAINT [FK_OrderItem_Order]
ALTER TABLE [dbo].[TestOrderPricing] WITH CHECK ADD CONSTRAINT [FK_OrderPricing_OrderItem] FOREIGN KEY([OrderItemId])
REFERENCES [dbo].[TestOrderItem] ([OrderItemId])
ON DELETE CASCADE
ALTER TABLE [dbo].[TestOrderPricing] CHECK CONSTRAINT [FK_OrderPricing_OrderItem]
2) 搭建模型
dnx ef dbcontext scaffold "Server=.;Database=Test;Trusted_Connection=True;" EntityFramework.MicrosoftSqlServer --outputDir Models
3) 运行 例子
或下载包含映射的控制台应用程序:
https://onedrive.live.com/redir?resid=352A0129BF9CBD17%2134155
观察:
- 如果我不使用服务器端生成的身份密钥,则没有问题
- 添加
entity.Property(e => e.OrderItemId).UseSqlServerIdentityColumn()
(不是由脚手架添加的)没有帮助
- 在每个子实体上设置对父实体的引用-属性没有帮助
- 添加较少的实体就没有问题
已在 RC1 中确认问题,已验证此问题已在工作代码库中修复,并且修复将在 RC2 中发布
通过 Entity Framework 7(候选版本 1)添加(中等)大量嵌套子实体会存储错误的实体->子实体映射。
重现问题的简化示例:
using (TestContext dbContext = new TestContext())
{
var nums = Enumerable.Range(1, 40);
var orders = nums.Select(s => new TestOrder()
{
name = s.ToString(),
TestOrderItem = nums.Take(10).Select(o => new TestOrderItem()
{
name = (s*100 + o).ToString(),
TestOrderPricing =
new[] {new TestOrderPricing() {amount = (s*100 + o), PricingType = "Principal"}}.ToList()
}).ToList()
});
dbContext.AddRange(orders);
dbContext.SaveChanges();
}
执行后,所有关系都被存储 - 但大多数 TestPricing 实体引用了错误的 TestOrderItem 实体。
这是 Entity Framework RC1 的现有错误还是我的设置有误?
测试环境设置:
- Visual Studio 2015
- DNX 4.6
- EF7 RC1
1) 数据库优先 - 创建 3 个表:
CREATE TABLE [dbo].[TestOrder](
[OrderId] [int] IDENTITY(1,1) NOT NULL,
[name] [varchar](100) NULL,
CONSTRAINT [PK_Order] PRIMARY KEY CLUSTERED
(
[OrderId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
CREATE TABLE [dbo].[TestOrderItem](
[OrderItemId] [int] IDENTITY(1,1) NOT NULL,
[OrderId] [int] NOT NULL,
[name] [varchar](100) NULL,
CONSTRAINT [PK_OrderItem] PRIMARY KEY CLUSTERED
(
[OrderItemId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
CREATE TABLE [dbo].[TestOrderPricing](
[OrderItemId] [int] NOT NULL,
[PricingType] [varchar](20) NOT NULL,
[amount] [decimal](18, 2) NULL,
CONSTRAINT [PK_OrderPricing] PRIMARY KEY CLUSTERED
(
[OrderItemId] ASC,
[PricingType] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
ALTER TABLE [dbo].[TestOrderItem] WITH CHECK ADD CONSTRAINT [FK_OrderItem_Order] FOREIGN KEY([OrderId])
REFERENCES [dbo].[TestOrder] ([OrderId])
ON DELETE CASCADE
ALTER TABLE [dbo].[TestOrderItem] CHECK CONSTRAINT [FK_OrderItem_Order]
ALTER TABLE [dbo].[TestOrderPricing] WITH CHECK ADD CONSTRAINT [FK_OrderPricing_OrderItem] FOREIGN KEY([OrderItemId])
REFERENCES [dbo].[TestOrderItem] ([OrderItemId])
ON DELETE CASCADE
ALTER TABLE [dbo].[TestOrderPricing] CHECK CONSTRAINT [FK_OrderPricing_OrderItem]
2) 搭建模型
dnx ef dbcontext scaffold "Server=.;Database=Test;Trusted_Connection=True;" EntityFramework.MicrosoftSqlServer --outputDir Models
3) 运行 例子
或下载包含映射的控制台应用程序:
https://onedrive.live.com/redir?resid=352A0129BF9CBD17%2134155
观察:
- 如果我不使用服务器端生成的身份密钥,则没有问题
- 添加
entity.Property(e => e.OrderItemId).UseSqlServerIdentityColumn()
(不是由脚手架添加的)没有帮助 - 在每个子实体上设置对父实体的引用-属性没有帮助
- 添加较少的实体就没有问题
已在 RC1 中确认问题,已验证此问题已在工作代码库中修复,并且修复将在 RC2 中发布