2014-04-19 5 views
0

나는 사용자 모델fluentApi를 사용하여 중첩 관계를 관리하는 방법은 무엇입니까?

public class User { 
    public Guid IdGuid {get;set;} 
    public string Name {get;set;} 
    public virtual List<User> Friends {get;set;} 
} 

을 그리고 난 내가 맥락에서 FluentApi 코드 OnModelcreating이 두 번째 모델을

public class UserFriendship{ 
    public Guid FriendShipIdGuid {get;set;} 
    public Guid UserIdGuid {get;set;} 
    public Guid FriendIdGuid {get;set;} 
} 

있습니다.

modelBuilder.Entity<User>().HasMany(u => u.Friends).WithMany().Map(c => { 
    c.MapLeftKey("UserIdGuid"); 
    c.MapRightKey("FriendIdGuid"); 
    c.ToTable("UserFriendship"); 
    }); 

문제 : 이미 UserFriendship 클래스 모델이 있습니다. 그리고이 모델에 대한 사용자에 대한 관계를 만들고 싶습니다. 그리고 저는 FluentApi로 그것을하고 있습니다.

FluentApi 코드를 실행 한 후 FriendShipIdGuidUserFriendship 표에서 제거되었습니다.

사용자를 위해 일대 다 관계를 만들어 테이블 UserFriendship에 저장하고 dbset의 요소 인 UserFriendship으로 기존 클래스 모델 이름을 매핑해야합니다. 제발 도와 주실 수 있습니까?

요약하면 이미 UserFriendship 클래스입니다. 이 클래스에는 FrientshipGuidId (키), UserIdGuid, FriendIdGuid이 포함되어 있습니다. 지도를 만들려면 User 클래스 one to many to this. 그리고 나는이 관계를 UserFriendship 클래스에 저장하려고합니다. 그리고 Userfriendship을 dbset으로 사용하고 싶습니다.

나는 나의 맥락에서

public DbSet<UserFriendship> Friendships { get;set; } 

있습니다.

FluentApi ToTable 함수를 사용하여 일대 다 관계 테이블을 만듭니다. FluentApi 코드에서 FriendshipIdGuid 필드를 삭제하십시오.

+0

코드 테이블을 기존 테이블과 함께 사용하려고합니까? – mostruash

+0

@mostruash 예. 유창하게 만드는 기존 테이블. 하지만이 UserFriendship을 dbset으로 사용해야합니다. 이 우정 데이터를 User 클래스 속성으로 사용하겠습니다. 이 속성은 List 친구입니다. 그게 가능하니? UserFriendship 테이블에서 User.Friends 목록을 생성해야하며 UserFriendship을 DbSet으로 사용해야합니다. – Ras

답변

0

불가능합니다. 당신은 List<UserFriendship>User 클래스를 사용할 수 있습니다 때때로 사용자는이처럼 UserFriendship 테이블에 중복이없는 한 사용자와 다른 경우는 사용자가 친구입니다 때문에 :

Friendship table:   | 
---------------------------- 

User/Friend 
------------- 
    A/ B 
    B/ A 
------------- 

먼저 변화 UserUserFriendship 클래스를 다음과 같이

class UserFriendship 
{ 
    public Guid FriendShipIdGuid {get;set;} 
    public Guid UserIdGuid {get;set;} 
    public Guid FriendIdGuid {get;set;} 

    public User User {get;set;} 
    public User Friend {get;set;} 
} 

class User 
{ 
    public Guid IdGuid {get;set;} 
    public string Name {get;set;} 

    // Only if you will allow duplicates in UserFriendship 
    public virtual List<UserFriendship> Friendships {get;set;} 
} 

내가 유창함 API의 정확한 구문/방법을 기억하지 않습니다하지만 당신은 아이디어를 얻을 것이다 :

modelBuilder.Entity<User>() 
    .HasKey(u => u.IdGuid) 
    .ToTable("User"); 

modelBuilder.Entity<UserFriendship>() 
    .HasKey(uf => uf.FriendShipIdGuid) 
    .ToTable("UserFriendship"); 

modelBuilder.Entity<UserFriendship>() 
    .HasRequired(uf => uf.User) 
    .WithMany(u => u.Friendships)  // Only if you allow duplicates 
    //.WithMany()       // Otherwise 
    .HasForeignKey(uf => uf.UserIdGuid); 

modelBuilder.Entity<UserFriendShip>() 
    .HasRequired(uf => uf.Friend) 
    .WithMany() 
    .HasForeignKey(uf => uf.FriendIdGuid); 
+0

중복 된 것을 말하면 무엇을 의미합니까? 예를 들어 친구가 2 명인 친구 1 명과 친구 2 명이 있습니다. 그걸 의미 한 것이 였니 ? 또 다른 생각, 당신은 /. WithMany(). 내가 중복을 사용하고 싶지 않다면이 .WithMany() 행을 삭제해야합니까? – Ras

+0

네, 그 말입니다. 중복을 사용하지 않으려면'.WithMany()'를 사용하십시오. User 클래스에서'List Friendships'을 삭제하십시오.나는 당신이 중복을 사용하는 것이 좋습니다. 그것은 당신의 인생을 더 쉽게 만들 것입니다. 이것이 당신을 도운다면 대답으로 받아 들여주십시오. – mostruash

+0

나는 fluentApi로 그것을 해결할 수 없다 :(다른 방법을 시도하고있다. 도움을 주셔서 감사합니다. – Ras