2013-12-11 3 views
2

설명해 드리겠습니다.EF 코드 문제로 데이터베이스 생성

새 프로젝트 (MVC5)를 시작하고 EF 비디오 예제에서 2 개의 테이블 (블로그 및 게시물)이있는 데이터베이스를 만들었습니다. 데이터베이스에 관계를 만든 다음 VistualStudioGallery.com에서 EF 도구를 다운로드했습니다.

그런 다음 도구를 사용하여 테이블을 리버스 엔지니어링하여 컨텍스트 및 모델 클래스/매핑을 생성했습니다.

지금까지 그렇게 좋았습니다.

는 그럼 같이하는 DB 컨텍스트를 수정 :
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 모델을 삭제했습니다.

  1. EntityFramework
  2. 마이크로 소프트 Asp.net 신원 코어
  3. 마이크로 소프트 Asp.net 신원 EntityFramework
  4. 마이크로 소프트 Asp.net 신원 Owin

후 설치 : 나는 다음에 대한 참조를 제거 그들에게 최신 버전. IdentityUser () AspNetUser (약간의 차이가 있습니다)과 함께 작업하기 때문에이 작업을 수행했습니다.

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에 탐색 속성 ...은 다음과 같습니다

IdentityUser을

나는 다음 F5 내 데이터베이스를 만들려면 내 프로젝트를 실행하고 문제가 시작된 곳이다. 당신이 볼 수 있듯이

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이 여러 로그인을 가질 수 있고, 로그인 하나 사용자가 있습니다 IdentityUserLogin 모델은 다음과 같습니다.나는 그 프로젝트에게 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 열을 추가하는 이유입니다.하지만 의미가 없습니다.

제 질문은, 이전에이 문제가 발생 했습니까? 그렇다면 정확한 매핑을 어떻게 수정하여 수정할 수 있습니까?

분명히 내가 ICollection에 하나의 참조를 만들기 위해 IdentityUser에게 클래스를 변경할 수 있습니다 (즉 아닌 컬렉션)

/r3plica

답변

0

때문에

public class IdentityUserLogin 
{ 

public IdentityUserLogin(); 

public virtual string LoginProvider { get; set; } 
public virtual string ProviderKey { get; set; } 
public virtual string UserId { get; set; } // if i am the key to IdentityUser 

[ForeignKey("UserId")] // IdentityUserId instead of USerId may have worked. 
         // see http://msdn.microsoft.com/en-us/data/jj713564 and 
         // http://msdn.microsoft.com/en-us/data/jj591583 
public virtual IdentityUser User { get; set; } 
협약

}

EDIT2 유창함 API .. (1)에 필요한 변화 : 1 /! : M/M : M, 필수/선택 등

modelBuilder.Entity<IdentityUserLogin>().HasRequired(t=>t.IdentityUser).WithMany().HasForeignKey(t=>t.UserId) 

fluent api

+0

유창 API 인해를 사용하여지도가 할 수있는 방법이 있나요 IdentityUserLogin 클래스에 액세스 할 수 없거나 제한을 추가하기 위해 해당 속성을 재정의 할 수 있습니까? – r3plica

+0

추가 할 때 다음 오류가 나타납니다. dentityUserLogin_User_Source :: Multiplicity가 'IdentityUserLogin_User'관계에서 'IdentityUserLogin_User_Source'역할에 유효하지 않습니다. 종속 역할은 주요 속성을 참조하므로 종속 역할의 다중도의 상한은 '1'이어야합니다. – r3plica

관련 문제