讓我試着解釋這一點。EF從代碼問題生成數據庫
我開始了一個新項目(MVC5),並創建了一個包含2個表(來自EF視頻示例)博客和帖子的數據庫。 我在數據庫中創建了關係,然後我從VistualStudioGallery.com下載了EF工具
然後,我使用該工具對錶格進行逆向工程,以生成上下文和模型類/映射。
到目前爲止這麼好。
然後我修改了數據庫上下文是這樣的:
public partial class EfExampleContext : IdentityDbContext<ApplicationUser>
{
public EfExampleContext()
: base("Name=DefaultConnection")
{
}
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new BlogMap());
modelBuilder.Configurations.Add(new PostMap());
}
}
然後我刪除了數據庫和F5跑到我的項目,希望它會產生我的數據庫,它做到了。 我注意到,它產生的帖子,博客,AspNetUsers,AspNetUserRoles,AspNetRoles,AspNetUserClaims和AspNetUserLogins表用正確的列和關係。
我然後刪除了數據庫和AspNetUser模型。 我再除去引用:
- 的EntityFramework
- 微軟Asp.net身份核心
- 微軟Asp.net身份的EntityFramework
- 微軟Asp.net身份Owin
,然後安裝他們與最新版本。我這樣做是因爲我想與IdentityUser而不是AspNetUser(有一些差異)。
我再F5跑到我的項目的創建數據庫,這就是問題的開始......
IdentityUser看起來是這樣的:
public class IdentityUser : IUser
{
public IdentityUser();
public IdentityUser(string userName);
public virtual ICollection<IdentityUserClaim> Claims { get; }
public virtual string Id { get; set; }
public virtual ICollection<IdentityUserLogin> Logins { get; }
public virtual string PasswordHash { get; set; }
public virtual ICollection<IdentityUserRole> Roles { get; }
public virtual string SecurityStamp { get; set; }
public virtual string UserName { get; set; }
}
注意ICollection的導航屬性。 的IdentityUserLogin模式是這樣的:
public class IdentityUserLogin
{
public IdentityUserLogin();
public virtual string LoginProvider { get; set; }
public virtual string ProviderKey { get; set; }
public virtual IdentityUser User { get; set; }
public virtual string UserId { get; set; }
}
正如你所看到的,IdentityUser可以有多個登錄和登錄有一個用戶。如果我運行該項目的IdentityUserLogins表看起來像這樣:
CREATE TABLE [dbo].[IdentityUserLogins](
[UserId] [nvarchar](128) NOT NULL,
[LoginProvider] [nvarchar](max) NULL,
[ProviderKey] [nvarchar](max) NULL,
[User_Id] [nvarchar](128) NULL,
CONSTRAINT [PK_dbo.IdentityUserLogins] PRIMARY KEY CLUSTERED
(
[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] TEXTIMAGE_ON [PRIMARY]
這裏有什麼不對。 UserId是一個PK,所以它不可能是0到多對多的關係,IdentityUsers這就是爲什麼EF添加其他User_Id列,但這沒有任何意義。
我的問題是,有沒有人遇到過這個? 如果是這樣,我如何生成正確的映射來修復它?
請注意,明顯我不能改變IdentityUser類,使ICollection的一個參考(即不是一個集合)
/r3plica
有一種映射,使用流暢的API,因爲我無法訪問IdentityUserLogin類,或者是否可以重寫Propery以添加約束? – r3plica
當我添加,我得到以下錯誤:dentityUserLogin_User_Source::多元化是關係'IdentityUserLogin_User'中的角色'IdentityUserLogin_User_Source'無效。由於依賴角色是指關鍵屬性,所以依賴角色的多重性的上界必須是'1'。 – r3plica