如何在使用BusinessIdentityId的AdventureWorks2016中插入新记录

时间:2017-10-18 00:12:02

标签: sql-server entity-framework entity-framework-core

这个问题被问到on MSDN但从未真正回答。

AdventureWorks2016使用“BusinessEntityId”作为多个表的主键。它不是标识列,但在使用它的所有表中都是唯一的,例如Sales.Store。

所以问题是,保存新记录时ID会从何而来?必须调用存储过程来获取下一个有效ID似乎很笨拙。

例如,如果我正在使用实体框架,我根本看不到它是如何工作的,但它应该专门用于在EF中展示继承。

我发现这种类型的结构很有用,但是没看到如何让它与EF Core一起使用。

CREATE TABLE [Sales].[Store](
    [BusinessEntityID] [int] NOT NULL,
    [Name] [dbo].[Name] NOT NULL,
    [SalesPersonID] [int] NULL,
    [Demographics] [xml](CONTENT [Sales].[StoreSurveySchemaCollection]) NULL,
    [rowguid] [uniqueidentifier] ROWGUIDCOL  NOT NULL,
    [ModifiedDate] [datetime] NOT NULL,
 CONSTRAINT [PK_Store_BusinessEntityID] PRIMARY KEY CLUSTERED





 CREATE TABLE [Person].[Person](
    [BusinessEntityID] [int] NOT NULL,
    [PersonType] [nchar](2) NOT NULL,
    [NameStyle] [dbo].[NameStyle] NOT NULL,
    [Title] [nvarchar](8) NULL,
    [FirstName] [dbo].[Name] NOT NULL,
    [MiddleName] [dbo].[Name] NULL,
    [LastName] [dbo].[Name] NOT NULL,
    [Suffix] [nvarchar](10) NULL,
    [EmailPromotion] [int] NOT NULL,
    [AdditionalContactInfo] [xml](CONTENT [Person].[AdditionalContactInfoSchemaCollection]) NULL,
    [Demographics] [xml](CONTENT [Person].[IndividualSurveySchemaCollection]) NULL,
    [rowguid] [uniqueidentifier] ROWGUIDCOL  NOT NULL,
    [ModifiedDate] [datetime] NOT NULL,
 CONSTRAINT [PK_Person_BusinessEntityID] PRIMARY KEY CLUSTERED 
(
    [BusinessEntityID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

1 个答案:

答案 0 :(得分:1)

在AdventureWorks2016数据库中有一个名为Person.BusinessEntity的表,该表包含一个标识列。

查看Sales.Store表,Person.BusinessEntity表有一个外键。

因此,首先需要保存Person.BusinessEntity表,然后在子表中保存Sales.Store。

在EF Core内部,您需要为实体添加配置,Person.BusinessEntity表的配置包括身份,Sales.Store需要具有必需的属性。

在保存中,您可以使用DbContext实例中的Database属性来使用事务。

如果要从现有数据库生成ef核心对象,可以使用脚手架或其他工具,例如CatFactory

请告诉我这是否有用。