1

나는 테이블 레스토랑이 있습니다. 레스토랑에는 여러 가지 특선 요리가 있습니다. 그리고 특산품 예를 들어 chinees, spahnish, 그리스 등코드 첫 번째 관계 일대 다/많음 대 많음

레스토랑 테이블/클래스입니다

[Table("Restaurant")] 
public class Restaurant 
{ 
    [Key] 
    [Column(Order = 0)] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 

    [Required] 
    [MaxLength(40)] 
    [Column(Order = 2)] 
    public string Name { get; set; } 

    [MaxLength(1000)] 
    [Column(Order = 6)] 
    public string Comments { get; set; } 

    public virtual ICollection<Specialties> Specialties { get; set; } 
} 

그리고 이것은 내 전문 테이블/클래스 :

public enum Specialty 
    { 
     Chinees = 0, 
     Spanish = 1, 
     Etc.. = 2, 
    } 

    [Table("Specialties")] 
    public class Specialties 
    { 
     [Key] 
     [Column(Order = 0)] 
     [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
     public int Id { get; set; } 

     [Required] 
     [Column(Order = 1)] 
     public Specialty Specialty { get; set; } 

     //[Required] 
     [MaxLength(20)] 
     [Column(Order = 2)] 
     public string Name { get; set; } 

     public virtual ICollection<Restaurant> Restaurant { get; set; } 
    } 

특산물 테이블이 사전입니다 - 데이터로 채워짐.

// Primary keys 
modelBuilder.Entity<Restaurant>().HasKey(q => q.Id); 
modelBuilder.Entity<Specialties>().HasKey(q => q.Id); 

// Relationship 
modelBuilder.Entity<Restaurant>() 
    .HasMany(q => q.Specialties) 
    .WithMany(q => q.Restaurant) 
    .Map(q => 
    { 
     q.ToTable("RestaurantSpecialty"); 
     q.MapLeftKey("RestaurantId"); 
     q.MapRightKey("SpecialtyId"); 
    }); 

그리고 내가있어 내 종자 함수 : Fluent Api

[Table("RestaurantSpecialties")] 
    public class RestaurantSpecialties 
    { 
     [Key] 
     public int RestaurantId { get; set; } 

     [Key] 
     public int SpecialtyId { get; set; } 

     [ForeignKey("RestaurantId")] 
     public virtual Restaurant Restaurant{ get; set; } 

     [ForeignKey("SpecialtyId")] 
     public virtual Specialties Specialty { get; set; } 
    } 

나는이 같은 모델을 정의하려고 :

많은 관계로 많은 내 테이블/클래스 다음과 같은 데이터를 시드 :

context.Specialties.AddOrUpdate(
    p => p.Specialty, 
    new Specialties { Specialty = Specialty.Chinees, Name = "Chinees" }, 
    new Specialties { Specialty = Specialty.Spanish, Name = "Spanish" }, 
    ); 

ICollection<Specialties> lstSpecialties = new List<Specialties>(); 
lstSpecialties.Add(context.Specialties.FirstOrDefault(x => x.Name == "Chinees")); 

context.Restaurants.AddOrUpdate(
    p => p.Name, 
    new Restaurant{ Name = "Ctr test1", Specialties = lstSpecialties, Comments = "sfasd" }, 
    new Restaurant{ Name = "Ctr test2", Specialties = lstSpecialties, Comments = "asd" }, 
); 

내 테이블 RestaurantSpecialties 계속하지 않는다 아무것도 아니야. 나는 두 테이블 모두의 이드를보기를 기대했다.

내가 뭘 잘못하고 있니?

[EDIT] 거트가 (단지 이름 변경 부분이 아닌 실제 이름)을 제안 할 것처럼 ENUM은 'RestaurantSpecialty'를 '특수'에서 변경 한

.

'Specialties'라는 복수 클래스도 'Specialty'로 이름이 바뀌 었습니다. 또한 Gert가 제안했기 때문에.

조인 테이블도 모델에서 제거되었습니다. 내 원래 게시물의 Fluent Api 부분이 그에 따라 업데이트되었습니다.

음식점 이름이 내가 처음에 잊어 버린 식당으로 바뀌 었습니다. 그래서 혼란을 극복하기 위해 나는 원래 코드 게시판에서도이 작업을 수행했습니다.

context.Specialties.AddOrUpdate(
    new Specialty { CateringSpecialty = RestaurantSpecialty.Chinese, Name = "Chinese" }, 
    new Specialty { CateringSpecialty = CateringSpecialty.Greeks, Name = "Greeks" }, 
); 


var aSpecialty = context.Specialties.FirstOrDefault(x => x.Name == "Chinese"); 
var restaurant1 = context.Restaurants.Include(c => c.Specialties).FirstOrDefault(x => x.Name == "Ctr test1"); 

if (restaurant1 == null) 
{ 
    restaurant1 = new Restaurant 
    { 
     Name = "Ctr test4", 
     Specialties = new List<Specialty> { aSpecialty }, 
     Comments = "testtttttttt" 
    }; 
    context.Restaurants.Add(restaurant1); 
} 
else 
{ 
    if (!restaurant1.Specialties.Any(s => s.Id == aSpecialty.Id)) 
     restaurant1.Specialties.Add(aSpecialty); 

     restaurant1.Name = "Ctr test4"; 
     restaurant1.Comments = "testtttt"; 
} 
+0

먼저 many to many 연관을 매핑하면'RestaurantSpecialties'가 클래스 모델의 일부가되어서는 안됩니다. –

+0

안녕하세요, 어떤 매핑을 사용해야하는지 잘 모르겠습니다. 하나에서 많은 것에서 많은 것에서 두 번이나 하나 또는 여러 번. 너는 무엇을 제안 하겠는가? – Yustme

+0

그건 너에게 달렸어. 그것은 순수한 접합점 테이블이므로 어느 방향 으로든 할 수 있습니다. 외래 키 연관 (연관 클래스 사용) 또는 독립 연관 사용 (사용하지 않음) 여부에 따라 다릅니다. 부가 메모 : 클래스 이름에 복수 단어를 사용하지 마십시오 ('Specialties'). 클래스와 열거 형의 이름을 모두 바꿉니다. –

답변

1

수동으로 추가/업데이트하십시오. AddOrUpdate 메서드는 관련 엔터티의 전체 개체 그래프 업데이트를 지원하지 않습니다. 부모 엔티티가 아직 존재하지 않으면 과 함께 관련 엔티티를 추가하는 것을 지원합니다 (). 그러나 "Chinees"전문 분야가 이미 관련 엔터티가없는 데이터베이스에있는 경우 관계가 업데이트되지 않을 수 있습니다.

context.Specialties.AddOrUpdate(
    p => p.Specialty, 
    new Specialties { Specialty = Specialty.Chinees, Name = "Chinees" }, 
    new Specialties { Specialty = Specialty.Spanish, Name = "Spanish" }, 
    ); 

var chineesSpecialty = context.Specialties 
    .FirstOrDefault(x => x.Name == "Chinees"); 

var catering1 = context.Caterings.Include(c => c.Specialties) 
    .FirstOrDefault(x => x.Name == "Ctr test1"); 

if (catering1 == null) 
{ 
    catering1 = new Catering 
    { 
     Name = "Ctr test1", 
     Specialties = new List<Specialties> { chineesSpecialty }, 
     Comments = "sfasd" 
    }; 
    context.Caterings.Add(catering1); 
} 
else 
{ 
    if (!catering1.Specialties.Any(s => s.Id == chineesSpecialty.Id)) 
     catering1.Specialties.Add(chineesSpecialty); 
    catering1.Comments = "sfasd"; 
} 

// and the same for "Ctr test2" 

이 또한 in this answer 언급되지만 코드 - 먼저 마이그레이션의 초기 미리보기 릴리스하는 동안, 그래서 이러한 제한은 여전히 ​​존재하는 경우 나는 확실하지 않다 :

A "수동 업데이트"는 같을 것이다 . 그러나 관계 테이블에 항목을 가져 오지 않는 이유가 설명됩니다.

지도 자체가 나에게 맞는 것 같습니다. (그러나 Gert Arnold가 코멘트에서 추천 한 바대로, 실제로는 RestaurantSpecialties 엔티티가 제거되어 모델이 복잡해지고 복잡해집니다.)

+0

안녕하세요, 귀하의 접근 방식을 시도하고 조인 테이블 didnt도 중 하나를 채 웁니다. 내가 제공 한 코드로 첫 번째 게시물을 업데이트하고 있습니다. – Yustme

+0

게시물이 업데이트되었습니다. 당신에게 더 많은 정보를주기 위해 나는 어떤 오류도 내지 않지만 modelbuilder에 의해 만들어진 조인 테이블은 전문을 레스토랑에 추가 할 때 채워지지 않는다. – Yustme

+1

@Yustme : ** context.Specialties.FirstOrDefault ...'줄 앞에'context.SaveChanges' **를 추가하고 다시 시도 할 수 있습니까? 중국 전문 분야가 아직 확정되지 않았으므로 중국 전문 분야가 아직 DB 'FirstOrDefault'에없는 데이터베이스에서 마이그레이션하면 'null'이 반환됩니다. – Slauma

관련 문제