2013-03-10 36 views
5

çok fazla ilişki tanımlanması Aşağıda görebileceğiniz gibi benim modelimde 3 sınıf var.Kod ilk varlık çerçevesi

[Table("UserProfile")] 
public class UserProfile 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 

    public string UserName { get; set; } 

    public ICollection<MartialArtUserProfile> MartialArtUserProfiles { get; set; } 
} 

[Table("MartialArt")] 
public class MartialArt 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 

    public string Name { get; set; } 

    public string Description { get; set; } 

    public string IconPath { get; set; } 

    public string ImagePath { get; set; } 

    public ICollection<MartialArtUserProfile> MartialArtUserProfiles { get; set; } 
} 

public class MartialArtUserProfile 
{ 
    public int UserProfileId { get; set; } 
    public UserProfile UserProfile { get; set; } 

    public int MartialArtId { get; set; } 
    public MartialArt MartialArt { get; set; } 
} 

Ve aşağıdaki gibi birçok ilişki çoğu için bir yapılandırma sınıf var: Ben KonsolPaket Yöneticisi Güncelleme-Veritabanı çalıştırmayı denediğinizde benim cumhuriyeti ilişkiyi tanımladıktan sonra

public class MartialArtUserProfileConfiguration : EntityTypeConfiguration<MartialArtUserProfile> 
{ 
    public MartialArtUserProfileConfiguration() 
    { 
     HasKey(a => new { a.MartialArtId, a.UserProfileId }); 

     HasRequired(a => a.MartialArt) 
      .WithMany(s => s.MartialArtUserProfiles) 
      .HasForeignKey(a => a.MartialArtId) 
      .WillCascadeOnDelete(false); 

     HasRequired(a => a.UserProfile) 
      .WithMany(p => p.MartialArtUserProfiles) 
      .HasForeignKey(a => a.UserProfileId) 
      .WillCascadeOnDelete(false); 
    } 
} 

yazıyor:

Model oluşturma sırasında bir veya daha fazla doğrulama hatası algılandı:

\ tSystem.Data.Entity.Edm.EdmEntityType:: EntityType 'MartialArtUserProfile' anahtar tanımlanmamış. Bu EntityType'ın anahtarını tanımlayın. \ tSystem.Data.Entity.Edm.EdmEntitySet: EntityType: EntitySet 'MartialArtUserProfiles', tanımlanmış anahtar içermeyen 'MartialArtUserProfile' türünü temel alır.

Neyi yanlış yapıyorum? peşin

sayesinde

+0

Gerçekten MartialArtUserProfile sınıfına mı ihtiyacınız var, yoksa çoktan çoğa ilişkisi kurmak için mi kullanıyorsunuz? –

+0

Sadece çoktan çoğa ilişki kurmak için kullanıyorum. @Sniffer – anilca

cevap

8

Ben sadece bir geçişli tabloyla pek bir sayıda oluşturmak için çalışıyoruz anlamak durumunda. Eğer öyleyse bu, buna yaklaşmanın başka bir yoludur. Aşağıdaki şekilde eşlemek için Fluent API'yi kullanın. Tablo adının ne olmasını istiyorsanız, UserProfileToMartialArt'u değiştirebilirsiniz. MartialArtUserProfile modelini oluşturmak yerine EF, sizin için orta zemin oluştursun. Bu ayrıca, sizi hatanın etrafına götüren anahtarlarınızı da belirtir. Sadece iki koleksiyonları ekleyin - MartialArts Modeli'nde

modelBuilder.Entity<UserProfile>() 
    .HasMany(b => b.MartialArts) 
    .WithMany(a => a.UserProfiles) 
    .Map(m => m.MapLeftKey("MartialArtId") 
     .MapRightKey("UserProfileId") 
     .ToTable("UserProfileToMartialArt")); 

UserProfile Modeli'nde

public IList<UserProfile> UserProfiles { get; set; } 

koymak EntityFramework 6.1 olarak

public IList<MartialArt> MartialArts { get; set; } 
+1

İnceleme geribildirimi aldım, yukarıdaki ilişkiyi tanımlamak için .Map'ı akıcı bir şekilde kullanmak, çözümün bir değişiklikten sonra derlenebilmesi için en iyi uygulama değildi ve bu durumun çalışma zamanına kadar olamayacağı anlamına gelmezdi. Reflection'ı veya başka bir yolu (kafamın üstünden, varlık tablosu özniteliğini ve eşlemeyi sabit olarak atama) kullanmanızı mı önerirsiniz? –

6

böyle yapıyor deneyin:

[Table("UserProfile")] 
public class UserProfile 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 

    public string UserName { get; set; } 

    [InverseProperty("UserProfiles")] 
    public IList<MartialArt> MartialArts { get; set; } 
} 

[Table("MartialArt")] 
public class MartialArt 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 

    public string Name { get; set; } 

    public string Description { get; set; } 

    public string IconPath { get; set; } 

    public string ImagePath { get; set; } 

    [InverseProperty("MartialArts")] 
    public IList<UserProfile> UserProfiles { get; set; } 
} 
+0

Bu benim için iyi çalışıyor. Her ne kadar ben sadece bir varlık diğeriyle bağlantılı olacağına dair bir senaryodayım. Bunu kullanarak mümkün mü? İlk önce bir IList Diğerleri {get; set;} vardı, ancak düzgün çalışmıyordu – Mzn

+0

1 ile 1 arasındaki ilişkiden mi bahsediyorsunuz? –

+0

Bir (tek yönlü) çok fazla ilişkiden bahsediyorum ... tek yönlü olarak kodumda bir navigasyon özelliği istiyorum. Bu büyük bir anlaşma değil, sadece merak ediyorum, eğer mümkünse, – Mzn

5

koymak, bunların hiçbirini yapmaya gerek yoktur Her sınıfın türleri ve her şey yerine düşer.

public class UserProfile { 
    public int Id { get; set; } 
    public string UserName { get; set; } 
    public virtual ICollection<MartialArt> MartialArts { get; set; } 

    public UserProfile() { 
     MartialArts = new List<MartialArt>(); 
    } 
} 

public class MartialArt { 
    public int Id { get; set; } 
    public string Name { get; set; } 
    // *snip* 
    public virtual ICollection<UserProfile> UserProfiles { get; set; } 

    public MartialArt() { 
     UserProfiles = new List<UserProfile>(); 
    } 
} 
+0

Awesome, benim için çalıştı. Olması gereken budur. Go 6.1 – parliament

+0

Eğer bu, Admir'in yukarıdaki cevabının bir evrimidir (http://stackoverflow.com/a/15328042/489396) ve 'yerine düşmek' konvansiyona dayanıyorsa, harita tablosu arasında hangi kurallar gereklidir? –

+1

@GusCrawford - Eşleştirme tablosu, kodunuzdan tamamen gizli tutulur, kodunuzda karşıt nesnenin iki koleksiyonu bulunarak oluşturulacaktır. –