SORU
8 Temmuz 2012, Pazar


Varlık Çerçevesi kod ilk çok-çok eşleme tablosu

Gelen örnekler gördüm online ve bir Programlama Varlık Çerçevesi CodeFirst kitap, bir koleksiyon üzerinde her iki sınıf EF oluşturmak bir eşleme tablosu gibi MembersRecipes ve birincil anahtar her sınıf olur bağlantı bu tablo.

Ben ne zaman ancak aşağıda, ben yerine Recipes *masa 9* Recipe_Id Members tablo adlı yeni bir alan.

Sadece oluşturur iki bir-çok ilişkileri için değil, bir çok-çok ben de Üye 3 bağlantılı Tarifleri (4,5,6) ve Tarifi 4 bağlı Üyeler (1,2,3) vb.

Bir şekilde bu eşleştirme tablosu oluşturmak için var mı? ve nasıl bu adı başka bir şey böyle yaparsanız bunu "yemek" ?

Teşekkürler

    public abstract class Entity {
        [Required]
        public int Id { get; set; }
    }   

    public class Member : Entity {
        [Required]
        public string Name { get; set; }

        public virtual IList<Recipe> Recipes { get; set; }
    }

    public class Recipe : Entity {  
        [Required]
        public string Name { get; set; }

        [ForeignKey("Author")]
        public int AuthorId { get; set; }
        public virtual Member Author { get; set; }

            ....

        public virtual IList<Member> Members { get; set; }
    }

GÜNCELLEME: Aşağıda başka bir yaklaşım var çalışan yok kullanın Akıcı API ve değiştirir AuthorId & Author Recipe ile bir işyeri sahibi bayrak, ben de yeniden adlandırılan aşağıda örnek Cookbooks MembersRecipes, Bu da giderir sorunum benzer ama cevap olarak bahsetti daha fazla etkileri.

public class MembersRecipes {

    [Key, Column(Order = 0)]
    [ForeignKey("Recipe")]
    public int RecipeId { get; set; }
    public virtual Recipe Recipe { get; set; }

    [Key, Column(Order = 1)]
    [ForeignKey("Member")]
    public int MemberId { get; set; }
    public virtual Member Member { get; set; }

    public bool Owner { get; set; }
}

ve Recipe & Member sınıflar koleksiyonları için değiştirdim

public virtual IList<MembersRecipes> MembersRecipes { get; set; }

CEVAP
8 Temmuz 2012, Pazar


DbContext senin OnModelCreating bunu yapmak için:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{    
    modelBuilder.Entity<Recipe>()
        .HasMany(x => x.Members)
        .WithMany(x => x.Recipes)
    .Map(x =>
    {
        x.ToTable("Cookbooks"); // third table is named Cookbooks
        x.MapLeftKey("RecipeId");
        x.MapRightKey("MemberId");
    });
}

Bu da, aynı şey tam tersi, madalyonun bir de diğer tarafı sadece bunu yapabilirsiniz:

modelBuilder.Entity<Member>()
    .HasMany(x => x.Recipes)
    .WithMany(x => x.Members)
.Map(x =>
{
  x.ToTable("Cookbooks"); // third table is named Cookbooks
  x.MapLeftKey("MemberId");
  x.MapRightKey("RecipeId");
});
Başka örnekler:

http://www.ienablemuch.com/2011/07/using-checkbox-list-on-aspnet-mvc-with_16.html

http://www.ienablemuch.com/2011/07/nhibernate-equivalent-of-entity.html

GÜNCELLEME

Yazar mülkiyet üzerindeki döngüsel referans, yukarıdaki kenara önlemek için, bu eklemek gerekir:

modelBuilder.Entity<Recipe>()
    .HasRequired(x => x.Author)
    .WithMany()
    .WillCascadeOnDelete(false);

Fikir buradan kaynaklı: EF Code First with many to many self referencing relationship

Çekirdek şeydir, bilgilendirmek EF Yazar özelliği olan bir Üye örneği) hiçbir Reçete koleksiyon(belirtilen WithMany()); bu şekilde döngüsel referans olabilir durdurdu Yazar özelliği.

Bu Kod İlk eşleştirmeleri yukarıdan oluşturulan tablolar

CREATE TABLE Members(
    Id int IDENTITY(1,1) NOT NULL primary key,
    Name nvarchar(128) NOT NULL
);


CREATE TABLE Recipes(
    Id int IDENTITY(1,1) NOT NULL primary key,
    Name nvarchar(128) NOT NULL,
    AuthorId int NOT NULL references Members(Id)
);


CREATE TABLE Cookbooks(
    RecipeId int NOT NULL,
    MemberId int NOT NULL,
    constraint pk_Cookbooks primary key(RecipeId,MemberId)
);

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ShayLoss

    ShayLoss

    5 Kasım 2009
  • The Platform

    The Platform

    14 HAZİRAN 2006