8. Modify MyModel.edmx (修改MyModel.edmx) - wezmag/AspNetIdentityDbFirst GitHub Wiki
This part is the most important and also the most difficult part.
這個步驟,也是最困難的步驟。
At beginning, the schema of our database looks like this:
還記得一開始,我們看到資料庫五張表的圖長這樣:
After we added it to our project, it looks like this:
但是當我們建立Model之後,它長這樣:
Something is missing here, the AspNetUserRoles
table. When creating data model using database first, the intermediate model for many-to-many relationship won't be created. In previous step 5. Creating DomainModels, we did create a model called AspNetUserRole
, which happens to be the intermediate model. So our goal in this step is to modify MyModel.edmx, add intermediate model and its relationships.
這中間差了一張 AspNetUserRoles 的資料表,這是因為當用 DbFirst 建立 DataModel 時,多對多的中介資料表並不會產生 Entity Class,但是還記得在5. 建立 DomainModels 時,我們有建立一個類別叫 AspNetUserRole,正好就是中介Entity Class,所以我們的目標就是要修改MyModel.edmx,並將中介資料表AspNetUserRole及其關聯,都做出來。
In addition, when I studied the source code of IdentityUser, I discovered that there are 3 navigation properties (Claims, Logins, Roles) which are quite different from the one generated from Db First. Not only the names are different, but also the types. This apply to other classes as well. Therefore, we also need to fix these by modify MyModel.edmx.
另外,在觀察 IdentityUser 的屬性後,我們也發現到,Db First 所產生出來的 AspNetUser Class 跟 IdentityUser 也有一些出入,例如: IdentityUser 有 Claims
, Logins
, Roles
這三個Navigation Properties,但是,我們的 AspNetUser 卻是用不一樣的名稱,又例如 Roles
這個Navigation Property是ICollection<IdentityUserRole>
,但是,AspNetUser的 AspNetRoles
卻是ICollection<AspNetRole>
,而 AspNetRole 是繼承 IdentityRole
,非我們需要的 IdentityUserRole
;而其他的類別也有類似的情形,因此,我們要花時間來修正這些錯誤,透過修改 MyModel.edmx。
Firstly, right click on MyModel.edmx, select Open With..., choose XML (Text) Editor to open it.
首先,在 MyModel.edmx 上按右鍵,點 Open With…
,選擇 XML (Text) Editor
開啟檔案
After open the file with XML Editor, there are 3 parts in a edmx file.
SSDL (StorageModels): "an XML-based language that describes the storage model of an Entity Framework application."
CSDL (ConceptualModels): "an XML-based language that describes the entities, relationships, and functions that make up a conceptual model of a data-driven application."
MSL (Mappings): "an XML-based language that describes the mapping between the conceptual model and storage model of an Entity Framework application."
In general, we will only modify CSDL and MSL here.
開啟之後,我們先看一下XML的結構,一個Db First產生出來的edmx分為三個部分
SSDL (StorageModels) : MSDN說是「描述 Entity Framework 應用程式的儲存體模型」,其實就是資料庫的樣貌
CSDL (ConceptualModels) : 「可描述組成資料驅動應用程式之概念模型的實體、關聯性和函式」,就是產生的Entity Class的樣貌
MSL (Mappings) : 「可描述概念模型和儲存模型 Entity Framework 應用程式的概念模型和儲存模型間的對應」,簡單來說,就是資料庫是怎麼對應到Entity Class
有了這三個的概念後,就可以著手進行了,原則上,我們會修改的部分,就是在CSDL跟MSL的部分。
CSDL:
這裡,我們先觀察CSDL的部分
In CSDL, there are 4 existing EntityTypes, AspNetUserRole is still missing. In Association & AssociationSet (relation), we can only see 3 here. In our database, there are 4 relations. We need to add them back.
在CSDL中,可以看到存在四個EntityType,還缺少了AspNetUserRole,在Association(關聯)的部分,只有三個,但是實際在資料庫中,有四個關聯,所以我們現在把需要的部分都建進去。
Add EntityType and corresponding EntitySet for AspNetUserRole.
我們先建AspNetUserRole這個EntityType及其對應的EntitySet
Delete the many-to-many association, add 2 one-to-many associations (AspNetUser -> AspNetUserRole and AspNetRole -> AspNetUserRole)
接著,我們把原先多對多的關聯刪掉,改成AspNetUser->AspNetUserRole及AspNetRole->AspNetUserRole這兩個一對多的關聯
Then, fix the properties errors:
接著,要來修改屬性錯誤的部分
- AspNetRole inherits from
IdentityRole<string>
, there is a navigation property namedUsers
with typeICollection<AspNetUser>
.
- AspNetRole 繼承
IdentityRole<string>
,裡面有一個Navigation Property是名稱是Users
,型別是ICollection<AspNetUser>
。
- AspNetUsersClaims inherits from
IdentityUserClaim<string>
. There is no navigation property, so delete it.
- AspNetUsersClaims 繼承
IdentityUserClaim<string>
,裡面並沒有Navigation Property,所以要將其刪除。
- AspNetUserLogins inherits from
IdentityUserLogins<string>
. There is no navigation property, so delete it as well.
- AspNetUserLogins 繼承
IdentityUserLogins<string>
,裡面亦沒有Navigation Property,所以一樣要刪除。
4. AspNetUser inherits from
IdentityUser<string, AspNetUserLogin, AspNetUserRole, AspNetUserClaim>
. There are 3 navigation properties:
-
Claims
:ICollection<AspNetUserClaim>
-
Logins
:ICollection<AspNetUserLogin>
-
Roles
:ICollection<AspNetUserRole>
- AspNetUser繼承
IdentityUser<string, AspNetUserLogin, AspNetUserRole, AspNetUserClaim>
,裡面有三個Navigation Property分別是
-
Claims
:ICollection<AspNetUserClaim>
-
Logins
:ICollection<AspNetUserLogin>
-
Roles
:ICollection<AspNetUserRole>
In MSL: Delete the AssociationSetMapping, and change it to EntitySetMapping
CSDL這樣就改完了,接著繼續改MSL的部分
展開MSL的部分,印入眼前的就是一堆的錯誤,這邊就先把AssociationSetMapping整個刪掉
修改成EntitySetMapping
Finally, build your project. If there is no error, then you are done here!
最後,Build看看,沒有錯誤,就代表你出運了
The final file is as below:
修改後的完整檔案如下:
<?xml version="1.0" encoding="utf-8"?>
<edmx:Edmx Version="3.0" xmlns:edmx="http://schemas.microsoft.com/ado/2009/11/edmx">
<!-- EF Runtime content -->
<edmx:Runtime>
<!-- SSDL content -->
<edmx:StorageModels>
<Schema Namespace="AspNetIdentitySampleDatabaseModel.Store" Provider="System.Data.SqlClient" ProviderManifestToken="2012" Alias="Self" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns:customannotation="http://schemas.microsoft.com/ado/2013/11/edm/customannotation" xmlns="http://schemas.microsoft.com/ado/2009/11/edm/ssdl">
<EntityType Name="AspNetRoles">
<Key>
<PropertyRef Name="Id" />
</Key>
<Property Name="Id" Type="nvarchar" MaxLength="128" Nullable="false" />
<Property Name="Name" Type="nvarchar" MaxLength="256" Nullable="false" />
</EntityType>
<EntityType Name="AspNetUserClaims">
<Key>
<PropertyRef Name="Id" />
</Key>
<Property Name="Id" Type="int" StoreGeneratedPattern="Identity" Nullable="false" />
<Property Name="UserId" Type="nvarchar" MaxLength="128" Nullable="false" />
<Property Name="ClaimType" Type="nvarchar(max)" />
<Property Name="ClaimValue" Type="nvarchar(max)" />
</EntityType>
<EntityType Name="AspNetUserLogins">
<Key>
<PropertyRef Name="LoginProvider" />
<PropertyRef Name="ProviderKey" />
<PropertyRef Name="UserId" />
</Key>
<Property Name="LoginProvider" Type="nvarchar" MaxLength="128" Nullable="false" />
<Property Name="ProviderKey" Type="nvarchar" MaxLength="128" Nullable="false" />
<Property Name="UserId" Type="nvarchar" MaxLength="128" Nullable="false" />
</EntityType>
<EntityType Name="AspNetUserRoles">
<Key>
<PropertyRef Name="UserId" />
<PropertyRef Name="RoleId" />
</Key>
<Property Name="UserId" Type="nvarchar" MaxLength="128" Nullable="false" />
<Property Name="RoleId" Type="nvarchar" MaxLength="128" Nullable="false" />
</EntityType>
<EntityType Name="AspNetUsers">
<Key>
<PropertyRef Name="Id" />
</Key>
<Property Name="Id" Type="nvarchar" MaxLength="128" Nullable="false" />
<Property Name="Email" Type="nvarchar" MaxLength="256" />
<Property Name="EmailConfirmed" Type="bit" Nullable="false" />
<Property Name="PasswordHash" Type="nvarchar(max)" />
<Property Name="SecurityStamp" Type="nvarchar(max)" />
<Property Name="PhoneNumber" Type="nvarchar(max)" />
<Property Name="PhoneNumberConfirmed" Type="bit" Nullable="false" />
<Property Name="TwoFactorEnabled" Type="bit" Nullable="false" />
<Property Name="LockoutEndDateUtc" Type="datetime" />
<Property Name="LockoutEnabled" Type="bit" Nullable="false" />
<Property Name="AccessFailedCount" Type="int" Nullable="false" />
<Property Name="UserName" Type="nvarchar" MaxLength="256" Nullable="false" />
</EntityType>
<Association Name="FK_dbo_AspNetUserClaims_dbo_AspNetUsers_UserId">
<End Role="AspNetUsers" Type="Self.AspNetUsers" Multiplicity="1">
<OnDelete Action="Cascade" />
</End>
<End Role="AspNetUserClaims" Type="Self.AspNetUserClaims" Multiplicity="*" />
<ReferentialConstraint>
<Principal Role="AspNetUsers">
<PropertyRef Name="Id" />
</Principal>
<Dependent Role="AspNetUserClaims">
<PropertyRef Name="UserId" />
</Dependent>
</ReferentialConstraint>
</Association>
<Association Name="FK_dbo_AspNetUserLogins_dbo_AspNetUsers_UserId">
<End Role="AspNetUsers" Type="Self.AspNetUsers" Multiplicity="1">
<OnDelete Action="Cascade" />
</End>
<End Role="AspNetUserLogins" Type="Self.AspNetUserLogins" Multiplicity="*" />
<ReferentialConstraint>
<Principal Role="AspNetUsers">
<PropertyRef Name="Id" />
</Principal>
<Dependent Role="AspNetUserLogins">
<PropertyRef Name="UserId" />
</Dependent>
</ReferentialConstraint>
</Association>
<Association Name="FK_dbo_AspNetUserRoles_dbo_AspNetRoles_RoleId">
<End Role="AspNetRoles" Type="Self.AspNetRoles" Multiplicity="1">
<OnDelete Action="Cascade" />
</End>
<End Role="AspNetUserRoles" Type="Self.AspNetUserRoles" Multiplicity="*" />
<ReferentialConstraint>
<Principal Role="AspNetRoles">
<PropertyRef Name="Id" />
</Principal>
<Dependent Role="AspNetUserRoles">
<PropertyRef Name="RoleId" />
</Dependent>
</ReferentialConstraint>
</Association>
<Association Name="FK_dbo_AspNetUserRoles_dbo_AspNetUsers_UserId">
<End Role="AspNetUsers" Type="Self.AspNetUsers" Multiplicity="1">
<OnDelete Action="Cascade" />
</End>
<End Role="AspNetUserRoles" Type="Self.AspNetUserRoles" Multiplicity="*" />
<ReferentialConstraint>
<Principal Role="AspNetUsers">
<PropertyRef Name="Id" />
</Principal>
<Dependent Role="AspNetUserRoles">
<PropertyRef Name="UserId" />
</Dependent>
</ReferentialConstraint>
</Association>
<EntityContainer Name="AspNetIdentitySampleDatabaseModelStoreContainer">
<EntitySet Name="AspNetRoles" EntityType="Self.AspNetRoles" Schema="dbo" store:Type="Tables" />
<EntitySet Name="AspNetUserClaims" EntityType="Self.AspNetUserClaims" Schema="dbo" store:Type="Tables" />
<EntitySet Name="AspNetUserLogins" EntityType="Self.AspNetUserLogins" Schema="dbo" store:Type="Tables" />
<EntitySet Name="AspNetUserRoles" EntityType="Self.AspNetUserRoles" Schema="dbo" store:Type="Tables" />
<EntitySet Name="AspNetUsers" EntityType="Self.AspNetUsers" Schema="dbo" store:Type="Tables" />
<AssociationSet Name="FK_dbo_AspNetUserClaims_dbo_AspNetUsers_UserId" Association="Self.FK_dbo_AspNetUserClaims_dbo_AspNetUsers_UserId">
<End Role="AspNetUsers" EntitySet="AspNetUsers" />
<End Role="AspNetUserClaims" EntitySet="AspNetUserClaims" />
</AssociationSet>
<AssociationSet Name="FK_dbo_AspNetUserLogins_dbo_AspNetUsers_UserId" Association="Self.FK_dbo_AspNetUserLogins_dbo_AspNetUsers_UserId">
<End Role="AspNetUsers" EntitySet="AspNetUsers" />
<End Role="AspNetUserLogins" EntitySet="AspNetUserLogins" />
</AssociationSet>
<AssociationSet Name="FK_dbo_AspNetUserRoles_dbo_AspNetRoles_RoleId" Association="Self.FK_dbo_AspNetUserRoles_dbo_AspNetRoles_RoleId">
<End Role="AspNetRoles" EntitySet="AspNetRoles" />
<End Role="AspNetUserRoles" EntitySet="AspNetUserRoles" />
</AssociationSet>
<AssociationSet Name="FK_dbo_AspNetUserRoles_dbo_AspNetUsers_UserId" Association="Self.FK_dbo_AspNetUserRoles_dbo_AspNetUsers_UserId">
<End Role="AspNetUsers" EntitySet="AspNetUsers" />
<End Role="AspNetUserRoles" EntitySet="AspNetUserRoles" />
</AssociationSet>
</EntityContainer>
</Schema></edmx:StorageModels>
<!-- CSDL content -->
<edmx:ConceptualModels>
<Schema Namespace="AspNetIdentitySampleDatabaseModel" Alias="Self" annotation:UseStrongSpatialTypes="false" xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation" xmlns:customannotation="http://schemas.microsoft.com/ado/2013/11/edm/customannotation" xmlns="http://schemas.microsoft.com/ado/2009/11/edm">
<EntityType Name="AspNetRole">
<Key>
<PropertyRef Name="Id" />
</Key>
<Property Name="Id" Type="String" MaxLength="128" FixedLength="false" Unicode="true" Nullable="false" />
<Property Name="Name" Type="String" MaxLength="256" FixedLength="false" Unicode="true" Nullable="false" />
<NavigationProperty Name="Users" Relationship="Self.FK_dbo_AspNetUserRoles_dbo_AspNetRoles_RoleId" FromRole="AspNetRoles" ToRole="AspNetUserRoles" />
</EntityType>
<EntityType Name="AspNetUserClaim">
<Key>
<PropertyRef Name="Id" />
</Key>
<Property Name="Id" Type="Int32" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
<Property Name="UserId" Type="String" MaxLength="128" FixedLength="false" Unicode="true" Nullable="false" />
<Property Name="ClaimType" Type="String" MaxLength="Max" FixedLength="false" Unicode="true" />
<Property Name="ClaimValue" Type="String" MaxLength="Max" FixedLength="false" Unicode="true" />
</EntityType>
<EntityType Name="AspNetUserLogin">
<Key>
<PropertyRef Name="LoginProvider" />
<PropertyRef Name="ProviderKey" />
<PropertyRef Name="UserId" />
</Key>
<Property Name="LoginProvider" Type="String" MaxLength="128" FixedLength="false" Unicode="true" Nullable="false" />
<Property Name="ProviderKey" Type="String" MaxLength="128" FixedLength="false" Unicode="true" Nullable="false" />
<Property Name="UserId" Type="String" MaxLength="128" FixedLength="false" Unicode="true" Nullable="false" />
</EntityType>
<EntityType Name="AspNetUser">
<Key>
<PropertyRef Name="Id" />
</Key>
<Property Name="Id" Type="String" MaxLength="128" FixedLength="false" Unicode="true" Nullable="false" />
<Property Name="Email" Type="String" MaxLength="256" FixedLength="false" Unicode="true" />
<Property Name="EmailConfirmed" Type="Boolean" Nullable="false" />
<Property Name="PasswordHash" Type="String" MaxLength="Max" FixedLength="false" Unicode="true" />
<Property Name="SecurityStamp" Type="String" MaxLength="Max" FixedLength="false" Unicode="true" />
<Property Name="PhoneNumber" Type="String" MaxLength="Max" FixedLength="false" Unicode="true" />
<Property Name="PhoneNumberConfirmed" Type="Boolean" Nullable="false" />
<Property Name="TwoFactorEnabled" Type="Boolean" Nullable="false" />
<Property Name="LockoutEndDateUtc" Type="DateTime" Precision="3" />
<Property Name="LockoutEnabled" Type="Boolean" Nullable="false" />
<Property Name="AccessFailedCount" Type="Int32" Nullable="false" />
<Property Name="UserName" Type="String" MaxLength="256" FixedLength="false" Unicode="true" Nullable="false" />
<NavigationProperty Name="Claims" Relationship="Self.FK_dbo_AspNetUserClaims_dbo_AspNetUsers_UserId" FromRole="AspNetUsers" ToRole="AspNetUserClaims" />
<NavigationProperty Name="Logins" Relationship="Self.FK_dbo_AspNetUserLogins_dbo_AspNetUsers_UserId" FromRole="AspNetUsers" ToRole="AspNetUserLogins" />
<NavigationProperty Name="Roles" Relationship="Self.FK_dbo_AspNetUserRoles_dbo_AspNetUsers_UserId" FromRole="AspNetUsers" ToRole="AspNetUserRoles" />
</EntityType>
<EntityType Name="AspNetUserRole">
<Key>
<PropertyRef Name="RoleId" />
<PropertyRef Name="UserId" />
</Key>
<Property Name="RoleId" Type="String" Nullable="false" MaxLength="128" Unicode="true" FixedLength="false" />
<Property Name="UserId" Type="String" Nullable="false" MaxLength="128" Unicode="true" FixedLength="false" />
</EntityType>
<Association Name="FK_dbo_AspNetUserClaims_dbo_AspNetUsers_UserId">
<End Role="AspNetUsers" Type="Self.AspNetUser" Multiplicity="1">
<OnDelete Action="Cascade" />
</End>
<End Role="AspNetUserClaims" Type="Self.AspNetUserClaim" Multiplicity="*" />
<ReferentialConstraint>
<Principal Role="AspNetUsers">
<PropertyRef Name="Id" />
</Principal>
<Dependent Role="AspNetUserClaims">
<PropertyRef Name="UserId" />
</Dependent>
</ReferentialConstraint>
</Association>
<Association Name="FK_dbo_AspNetUserLogins_dbo_AspNetUsers_UserId">
<End Role="AspNetUsers" Type="Self.AspNetUser" Multiplicity="1">
<OnDelete Action="Cascade" />
</End>
<End Role="AspNetUserLogins" Type="Self.AspNetUserLogin" Multiplicity="*" />
<ReferentialConstraint>
<Principal Role="AspNetUsers">
<PropertyRef Name="Id" />
</Principal>
<Dependent Role="AspNetUserLogins">
<PropertyRef Name="UserId" />
</Dependent>
</ReferentialConstraint>
</Association>
<Association Name="FK_dbo_AspNetUserRoles_dbo_AspNetUsers_UserId">
<End Role="AspNetUsers" Type="Self.AspNetUser" Multiplicity="1">
<OnDelete Action="Cascade" />
</End>
<End Role="AspNetUserRoles" Type="Self.AspNetUserRole" Multiplicity="*" />
<ReferentialConstraint>
<Principal Role="AspNetUsers">
<PropertyRef Name="Id" />
</Principal>
<Dependent Role="AspNetUserRoles">
<PropertyRef Name="UserId" />
</Dependent>
</ReferentialConstraint>
</Association>
<Association Name="FK_dbo_AspNetUserRoles_dbo_AspNetRoles_RoleId">
<End Role="AspNetRoles" Type="Self.AspNetRole" Multiplicity="1">
<OnDelete Action="Cascade" />
</End>
<End Role="AspNetUserRoles" Type="Self.AspNetUserRole" Multiplicity="*" />
<ReferentialConstraint>
<Principal Role="AspNetRoles">
<PropertyRef Name="Id" />
</Principal>
<Dependent Role="AspNetUserRoles">
<PropertyRef Name="RoleId" />
</Dependent>
</ReferentialConstraint>
</Association>
<EntityContainer Name="MyContext" annotation:LazyLoadingEnabled="true">
<EntitySet Name="AspNetRoles" EntityType="Self.AspNetRole" />
<EntitySet Name="AspNetUserClaims" EntityType="Self.AspNetUserClaim" />
<EntitySet Name="AspNetUserLogins" EntityType="Self.AspNetUserLogin" />
<EntitySet Name="AspNetUsers" EntityType="Self.AspNetUser" />
<EntitySet Name="AspNetUserRoles" EntityType="Self.AspNetUserRole" />
<AssociationSet Name="FK_dbo_AspNetUserClaims_dbo_AspNetUsers_UserId" Association="Self.FK_dbo_AspNetUserClaims_dbo_AspNetUsers_UserId">
<End Role="AspNetUsers" EntitySet="AspNetUsers" />
<End Role="AspNetUserClaims" EntitySet="AspNetUserClaims" />
</AssociationSet>
<AssociationSet Name="FK_dbo_AspNetUserLogins_dbo_AspNetUsers_UserId" Association="Self.FK_dbo_AspNetUserLogins_dbo_AspNetUsers_UserId">
<End Role="AspNetUsers" EntitySet="AspNetUsers" />
<End Role="AspNetUserLogins" EntitySet="AspNetUserLogins" />
</AssociationSet>
<AssociationSet Name="FK_dbo_AspNetUserRoles_dbo_AspNetUsers_UserId" Association="Self.FK_dbo_AspNetUserRoles_dbo_AspNetUsers_UserId">
<End Role="AspNetUsers" EntitySet="AspNetUsers" />
<End Role="AspNetUserRoles" EntitySet="AspNetUserRoles" />
</AssociationSet>
<AssociationSet Name="FK_dbo_AspNetUserRoles_dbo_AspNetRoles_RoleId" Association="Self.FK_dbo_AspNetUserRoles_dbo_AspNetRoles_RoleId">
<End Role="AspNetRoles" EntitySet="AspNetRoles" />
<End Role="AspNetUserRoles" EntitySet="AspNetUserRoles" />
</AssociationSet>
</EntityContainer>
</Schema>
</edmx:ConceptualModels>
<!-- C-S mapping content -->
<edmx:Mappings>
<Mapping Space="C-S" xmlns="http://schemas.microsoft.com/ado/2009/11/mapping/cs">
<EntityContainerMapping StorageEntityContainer="AspNetIdentitySampleDatabaseModelStoreContainer" CdmEntityContainer="MyContext">
<EntitySetMapping Name="AspNetRoles">
<EntityTypeMapping TypeName="AspNetIdentitySampleDatabaseModel.AspNetRole">
<MappingFragment StoreEntitySet="AspNetRoles">
<ScalarProperty Name="Id" ColumnName="Id" />
<ScalarProperty Name="Name" ColumnName="Name" />
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
<EntitySetMapping Name="AspNetUserClaims">
<EntityTypeMapping TypeName="AspNetIdentitySampleDatabaseModel.AspNetUserClaim">
<MappingFragment StoreEntitySet="AspNetUserClaims">
<ScalarProperty Name="Id" ColumnName="Id" />
<ScalarProperty Name="UserId" ColumnName="UserId" />
<ScalarProperty Name="ClaimType" ColumnName="ClaimType" />
<ScalarProperty Name="ClaimValue" ColumnName="ClaimValue" />
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
<EntitySetMapping Name="AspNetUserLogins">
<EntityTypeMapping TypeName="AspNetIdentitySampleDatabaseModel.AspNetUserLogin">
<MappingFragment StoreEntitySet="AspNetUserLogins">
<ScalarProperty Name="LoginProvider" ColumnName="LoginProvider" />
<ScalarProperty Name="ProviderKey" ColumnName="ProviderKey" />
<ScalarProperty Name="UserId" ColumnName="UserId" />
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
<EntitySetMapping Name="AspNetUsers">
<EntityTypeMapping TypeName="AspNetIdentitySampleDatabaseModel.AspNetUser">
<MappingFragment StoreEntitySet="AspNetUsers">
<ScalarProperty Name="Id" ColumnName="Id" />
<ScalarProperty Name="Email" ColumnName="Email" />
<ScalarProperty Name="EmailConfirmed" ColumnName="EmailConfirmed" />
<ScalarProperty Name="PasswordHash" ColumnName="PasswordHash" />
<ScalarProperty Name="SecurityStamp" ColumnName="SecurityStamp" />
<ScalarProperty Name="PhoneNumber" ColumnName="PhoneNumber" />
<ScalarProperty Name="PhoneNumberConfirmed" ColumnName="PhoneNumberConfirmed" />
<ScalarProperty Name="TwoFactorEnabled" ColumnName="TwoFactorEnabled" />
<ScalarProperty Name="LockoutEndDateUtc" ColumnName="LockoutEndDateUtc" />
<ScalarProperty Name="LockoutEnabled" ColumnName="LockoutEnabled" />
<ScalarProperty Name="AccessFailedCount" ColumnName="AccessFailedCount" />
<ScalarProperty Name="UserName" ColumnName="UserName" />
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
<EntitySetMapping Name="AspNetUserRoles">
<EntityTypeMapping TypeName="AspNetIdentitySampleDatabaseModel.AspNetUserRole">
<MappingFragment StoreEntitySet="AspNetUserRoles">
<ScalarProperty Name="RoleId" ColumnName="RoleId" />
<ScalarProperty Name="UserId" ColumnName="UserId" />
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
</EntityContainerMapping>
</Mapping>
</edmx:Mappings>
</edmx:Runtime>
<!-- EF Designer content (DO NOT EDIT MANUALLY BELOW HERE) -->
<Designer xmlns="http://schemas.microsoft.com/ado/2009/11/edmx">
<Connection>
<DesignerInfoPropertySet>
<DesignerProperty Name="MetadataArtifactProcessing" Value="EmbedInOutputAssembly" />
</DesignerInfoPropertySet>
</Connection>
<Options>
<DesignerInfoPropertySet>
<DesignerProperty Name="ValidateOnBuild" Value="true" />
<DesignerProperty Name="EnablePluralization" Value="true" />
<DesignerProperty Name="IncludeForeignKeysInModel" Value="true" />
<DesignerProperty Name="UseLegacyProvider" Value="false" />
<DesignerProperty Name="CodeGenerationStrategy" Value="None" />
</DesignerInfoPropertySet>
</Options>
<!-- Diagram content (shape and connector positions) -->
<Diagrams></Diagrams>
</Designer>
</edmx:Edmx>