2011-03-22 4 views
3

기존 데이터베이스가 있으며 새 개체와 소품을 이전 테이블과 열에 매핑합니다. 여태까지는 그런대로 잘됐다. 우리는 성공적으로 매핑 된 many-to-many 관계를 가진다. 중간 테이블에는 추가 데이터가 들어 있습니다. 중간 테이블을 객체에 매핑하려고하면 이미 매핑이 정의되어 있다는 예외가 생깁니다. 관계의 어느 한쪽에서 매핑을 제거하면 테이블이 누락되었다는 오류가 발생합니다 (ofc, 우리는 그냥 예상합니다). NHibernate로 쉽게 할 수 있고 EF가 정말 많은 기능을 잃어 버렸다고 생각하기 시작했습니다. 그래서 제발, 제가 틀렸다고 말하면 우리는 EF로 그 일을 할 수 있습니다.EF CF : 추가 정보가있는 다 대다 관계

감사합니다.

EDIT : 여기는 실패한 더미 샘플입니다.

class User 
{ 
    public ICollection<User> Followers{get;set;} 
} 

class UserRelation 
{ 
    public User User{get;set;} 
    public User Follower{get;set;} 
    public DateTime CreatedOn{get;set;} 
} 

사용자 매핑

modelBuilder 
    .Entity<User>() 
    .HasMany<User>(user => user.Followers) 
    .WithMany() 
    .Map(m =>m.MapLeftKey("user_id").MapRightKey("follower_id") 
    .ToTable("user_follower")); 

사용자 관계 매핑

modelBuilder 
    .Entity<UserRelation>() 
    .ToTable("user_follower"); 

modelBuilder 
    .Entity<UserRelation>() 
    .HasOptional<User>(f => f.User) 
    .WithRequired().Map(m => m.MapKey("user_id")); 

modelBuilder 
    .Entity<UserRelation>() 
    .HasOptional<User>(f => f.Follower) 
    .WithRequired().Map(m => m.MapKey("follower_id")); 

modelBuilder 
    .Entity<UserRelation>() 
    .Property(entity => entity.CreatedOn) 
    .HasColumnName("created_on"); 

예외

지정한 스키마가 유효하지 않습니다. 오류 : (67,6) : 오류 0019 : 스키마 'dbo'및 'user_follower'테이블이있는 EntitySet 'UserUser'가 이미 정의되었습니다. 각 EntitySet은 고유 한 스키마 및 테이블을 참조해야합니다.

Edit2가 : http://learnentityframework.com/LearnEntityFramework/tutorials/many-to-many-relationships-in-the-entity-data-model/

+0

여러 대다 관계를 매우 성공적으로, 당신은 우리에게 몇 가지 예를 보여 아마도 경우 문제가있다, 우리가 도울 수있다 –

+0

예, 그걸 깨달았습니다. 샘플이 올라갔습니다. – mynkow

답변

9

직접 다 대다 맵핑은 접합 테이블에 외래 키만 들어있는 경우에만 사용할 수 있습니다. 접합점 테이블에 다른 특성을 표시하려면 다 대다 (many-to-many)에서 사용 된 이전 엔티티와 별도의 엔티티 및 맵핑 두 개의 일대 다 관계에 맵핑해야합니다.

귀하의 사례를 이해할 수 없기 때문에 실제로 코드를 작성할 수 없습니다.

만보세요 (매핑되지 않는 대다 사용자의) :

I가 EF를 사용
modelBuilder.Entity<UserRelation> 
    .HasRequired(r => r.User) 
    .WithMany(u => u.Followers); 

modelBuilder.Entity<UserRelation> 
    .HasRequired(r => r.Follower) 
    .WithMany(); 
+0

한 명의 사용자가 많은 사용자를 보유 할 수 있습니다. 다 대 다 관계는 2 개의 테이블과 접합 테이블이 아닌 1 개의 테이블과 접합 테이블에서 온 것입니다. 별도의 Entity는 UserRelation입니다. – mynkow

+0

10x, User 클래스가 UserNew라고 상상해보십시오. UserNew에서지도를 제거하면 UserNew_id가 존재하지 않는다고 알려줍니다. : | – mynkow

+0

질문을 수정하고 새 코드 매핑을 추가하십시오. –

1

EF는 관련 개체의 속성으로 다 대다 관계를 매핑 : 다음은이 모델의 또 다른 예입니다.

따라서 m-to-n과 관련된 CarsDrivers이 있다고 가정 해 보겠습니다. EF 모델에서 각 Car 개체는 Drivers 컬렉션을 속성으로 가지며 각 Driver 개체는 Cars 컬렉션 속성을가집니다.

이것은 m-to-n 관계가 EF에서 모델링되는 방식입니다.

+0

나는 관계를 만들려고 뜨거운 것을 알고 있습니다. 나는 그것에 대해 묻지 않는다. – mynkow

+0

Junction 테이블을 모델링하려고 했으므로 이들을 작성하는 f}을 알 수 있지만, 작동 f}을 이해할 수 있을지는의 L합니다. –

+0

10 배 브라이언하지만 나는 잘못된 방향으로 가고 있다고 생각합니다. 모델을 매핑하는 방법에 대한 세부 정보로 질문을 업데이트했습니다. – mynkow