私は最初のMVC 5/Entity Frameworkアプリケーションを構築しています。データベースの最初の方法を使用して、既存のSQLサーバーからデータを取得しました。既存のSQLデータベースは、別のWebフォーム.netアプリケーションからデータを受け取ります。
今後、新しいMVCアプリケーションと既存のWebフォームアプリケーションはデータベースを共有します。
Identityを使用して、MVCアプリケーション内にユーザーアカウントを作成しています。そのため、この時点で、MVCアプリケーションには2つのデータ接続があります。 1つはユーザーアカウント用で、もう1つは既存のSQLサーバー用です。
これがMVCプロジェクトをセットアップする最良の方法ですか?今後、Webフォームアプリケーションからユーザーデータベースにアクセスできますか?
私は初心者です。これを正しく設定していることを確認したいと思います。
ユーザーテーブルは既存のSQLサーバーに追加されますか、それともこのユーザーデータベースは完全に独立したデータベースですか?
2つのデータベースは必要ありません-既存のデータベース内にIDテーブルを作成できます。
ASP.Net IdentityはEntity Framework Code Firstを使用します。したがって、アプリケーションを初めて実行する前に、通常はApplicationDbContext内にある既存のデータベースと同じ接続文字列を更新する必要があります。
すでに2つの個別のデータベースがあり、それらをマージする場合は、RedGate-SQL CompareおよびData Compareなどのツールを使用します。
2つのデータベースをマージすることは完全に元の問題ではありません。質問がある場合は、別の質問を作成してください。
データベースでこのSQLスクリプトを実行します。
/****** Object: Table [dbo].[AspNetRoles] Script Date: 15-Mar-17 10:27:06 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[AspNetRoles](
[Id] [nvarchar](128) NOT NULL,
[Name] [nvarchar](256) NOT NULL,
CONSTRAINT [PK_dbo.AspNetRoles] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: Table [dbo].[AspNetUserClaims] Script Date: 15-Mar-17 10:27:06 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[AspNetUserClaims](
[Id] [int] IDENTITY(1,1) NOT NULL,
[UserId] [nvarchar](128) NOT NULL,
[ClaimType] [nvarchar](max) NULL,
[ClaimValue] [nvarchar](max) NULL,
CONSTRAINT [PK_dbo.AspNetUserClaims] PRIMARY KEY CLUSTERED
(
[Id] 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
/****** Object: Table [dbo].[AspNetUserLogins] Script Date: 15-Mar-17 10:27:06 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[AspNetUserLogins](
[LoginProvider] [nvarchar](128) NOT NULL,
[ProviderKey] [nvarchar](128) NOT NULL,
[UserId] [nvarchar](128) NOT NULL,
CONSTRAINT [PK_dbo.AspNetUserLogins] PRIMARY KEY CLUSTERED
(
[LoginProvider] ASC,
[ProviderKey] ASC,
[UserId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: Table [dbo].[AspNetUserRoles] Script Date: 15-Mar-17 10:27:06 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[AspNetUserRoles](
[UserId] [nvarchar](128) NOT NULL,
[RoleId] [nvarchar](128) NOT NULL,
CONSTRAINT [PK_dbo.AspNetUserRoles] PRIMARY KEY CLUSTERED
(
[UserId] ASC,
[RoleId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: Table [dbo].[AspNetUsers] Script Date: 15-Mar-17 10:27:06 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[AspNetUsers](
[Id] [nvarchar](128) NOT NULL,
[Email] [nvarchar](256) NULL,
[EmailConfirmed] [bit] NOT NULL,
[PasswordHash] [nvarchar](max) NULL,
[SecurityStamp] [nvarchar](max) NULL,
[PhoneNumber] [nvarchar](max) NULL,
[PhoneNumberConfirmed] [bit] NOT NULL,
[TwoFactorEnabled] [bit] NOT NULL,
[LockoutEndDateUtc] [datetime] NULL,
[LockoutEnabled] [bit] NOT NULL,
[AccessFailedCount] [int] NOT NULL,
[UserName] [nvarchar](256) NOT NULL,
CONSTRAINT [PK_dbo.AspNetUsers] PRIMARY KEY CLUSTERED
(
[Id] 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
ALTER TABLE [dbo].[AspNetUserClaims] WITH CHECK ADD CONSTRAINT [FK_dbo.AspNetUserClaims_dbo.AspNetUsers_UserId] FOREIGN KEY([UserId])
REFERENCES [dbo].[AspNetUsers] ([Id])
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[AspNetUserClaims] CHECK CONSTRAINT [FK_dbo.AspNetUserClaims_dbo.AspNetUsers_UserId]
GO
ALTER TABLE [dbo].[AspNetUserLogins] WITH CHECK ADD CONSTRAINT [FK_dbo.AspNetUserLogins_dbo.AspNetUsers_UserId] FOREIGN KEY([UserId])
REFERENCES [dbo].[AspNetUsers] ([Id])
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[AspNetUserLogins] CHECK CONSTRAINT [FK_dbo.AspNetUserLogins_dbo.AspNetUsers_UserId]
GO
ALTER TABLE [dbo].[AspNetUserRoles] WITH CHECK ADD CONSTRAINT [FK_dbo.AspNetUserRoles_dbo.AspNetRoles_RoleId] FOREIGN KEY([RoleId])
REFERENCES [dbo].[AspNetRoles] ([Id])
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[AspNetUserRoles] CHECK CONSTRAINT [FK_dbo.AspNetUserRoles_dbo.AspNetRoles_RoleId]
GO
ALTER TABLE [dbo].[AspNetUserRoles] WITH CHECK ADD CONSTRAINT [FK_dbo.AspNetUserRoles_dbo.AspNetUsers_UserId] FOREIGN KEY([UserId])
REFERENCES [dbo].[AspNetUsers] ([Id])
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[AspNetUserRoles] CHECK CONSTRAINT [FK_dbo.AspNetUserRoles_dbo.AspNetUsers_UserId]
GO
DB Firstでは、接続文字列を変更してもIdentity 2.0はDBにテーブルを作成しません。
CORRECTION: IDスキーマの下のDBにIDテーブルが最初にあり、以下を使用して新しいユーザーを登録すると、dboスキーマの下のDBに新しいテーブルが書き込まれました。
Code Firstを使用して最初にダミープロジェクトを作成し、プロジェクトをビルドして実行し、Webブラウザーで現在実行中のアプリに移動し、ダミーの電子メールとパスワードでユーザーを登録する必要があります。これにより、Entity FrameWork Code First(?)ダミーデータベースにすべてのIdentity 2.0 DBテーブルを作成します。次に、ダミーテーブルをSQLスクリプトにエクスポートし、それらを使用する既存のDBにインポートします。AspNetUserRoles、AspNetRoles、AspNetUsers、AspNetUserClaims、およびAspNetUserLoginsの5つのテーブルが必要です。
メインのDBモデル用のADO.Netエンティティモデル(.edmxファイル)があり、アイデンティティモデル用に別の.edmxを作成しました(IdentityDbEntities)。そのとき、接続文字列を「DefaultConnection」から変更する必要があります。
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("IdentityDbEntitiesString", throwIfV1Schema: false)
{
}
非常に重要:Web.configファイルに、上記で使用する追加の接続文字列を追加する必要があります。次のようになります(SQL Server Dev環境を使用しているため、接続文字列が変更される可能性があります)。
<connectionStrings>
<add name="IdentityDbEntitiesString"
connectionString="Data Source=#MyServerAddress#;
Initial Catalog=#DbName#;
Integrated Security=SSPI;"
providerName="System.Data.SqlClient" />
<add name="IdentityDbEntities"
connectionString="metadata=res://*/Models.IdentityModel.csdl|
res://*/Models.IdentityModel.ssdl|
res://*/Models.IdentityModel.msl;
provider=System.Data.SqlClient;
provider connection string="
data source=#MyServerAddress#;
initial catalog=#DbName#;
integrated security=True;multipleactiveresultsets=True;
application name=EntityFramework""
providerName="System.Data.EntityClient" /> </connectionStrings>
#の中の#DbName#のようなものはすべてカスタムです。