c# update جدول تنسيق متعدد كثير



many to many update entity framework (1)

القيام بذلك على DbContext OnModelCreating الخاص بك:

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");
    });
}

يمكنك فعل ذلك في الاتجاه المعاكس أيضًا ، إنه نفس الشيء ، فقط جانب آخر من العملة نفسها:

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");
});

مزيد من الأمثلة:

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

تحديث

لمنع المرجع الدوري في موقع المؤلف الخاص بك ، بالإضافة إلى ما سبق ، تحتاج إلى إضافة هذا:

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

فكرة مصدرها هنا: EF Code First with many to many self referencing relationship

الشيء الأساسي هو ، تحتاج إلى إعلام EF أن خاصية الكاتب (وهو مثال عضو) لا تحتوي على مجموعات Recipe (يشار إليها بواسطة WithMany() ) ؛ بهذه الطريقة ، يمكن إيقاف المرجع الدوري في خاصية المؤلف.

هذه هي الجداول التي تم إنشاؤها من تعيينات Code First أعلاه:

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)
);

من الأمثلة التي رأيتها عبر الإنترنت وفي كتاب CodeFile Framework Entity Framework ، عندما يكون لديك مجموعة على كلتا الفئتين EF ستقوم بإنشاء جدول تعيين مثل MembersRecipes والمفتاح الأساسي من كل فصل يرتبط بهذا الجدول.

ولكن عندما أقوم بذلك أدناه ، سأحصل بدلاً من ذلك على حقل جديد في جدول Recipes يُسمى Member_Id و Recipe_Id في جدول Members .

الذي لا يخلق سوى علاقات بين شخصين إلى عدة ، ولكن ليس عددًا كبيرًا من الأطراف ، لذلك يمكنني أن أحصل على عضو 3 مرتبط بوصفات (4،5،6) وصفة 4 مرتبطة بالأعضاء (1،2،3) إلخ.

هل هناك طريقة لإنشاء جدول الخرائط هذا؟ وإذا كان الأمر كذلك ، كيف تسميها شيئًا آخر مثل "كتب الطبخ"؟

شكر

    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; }
    }

استكمال: أدناه هو نهج آخر حاولت التي لا تستخدم واجهة برمجة التطبيقات بطلاقة وتحل محل AuthorId & Author على Recipe مع العلم مالك ، لقد قمت أيضا بإعادة تسمية المثال التالي من كتب Cookbooks إلى MembersRecipes ، وهذا أيضا بإصلاح MembersRecipes مماثلة ل الجواب ولكن كما ذكر له آثار أخرى.

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; }
}

وفي Recipe & فئات Member لقد غيرت مجموعات ل

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




many-to-many