সমিতি টেবিলের অতিরিক্ত ক্ষেত্রগুলি সহ প্রথমে কোড তৈরি করুন many


297

আমার এই দৃশ্যটি রয়েছে:

public class Member
{
    public int MemberID { get; set; }

    public string FirstName { get; set; }
    public string LastName { get; set; }

    public virtual ICollection<Comment> Comments { get; set; }
}

public class Comment
{
    public int CommentID { get; set; }
    public string Message { get; set; }

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

public class MemberComment
{
    public int MemberID { get; set; }
    public int CommentID { get; set; }
    public int Something { get; set; }
    public string SomethingElse { get; set; }
}

আমি কীভাবে সাবলীল এপিআইয়ের সাথে আমার সংযোগটি কনফিগার করব ? বা সমিতি টেবিল তৈরি করার জন্য আরও ভাল উপায় আছে?

উত্তর:


524

একটি কাস্টমাইজড যোগদানের টেবিলের সাথে একাধিক থেকে বেশি সম্পর্ক তৈরি করা সম্ভব নয়। বহু-বহু সম্পর্কের মধ্যে ইএফ অভ্যন্তরীণ এবং লুকিয়ে থাকা টেবিল পরিচালনা করে। এটি আপনার মডেলের কোনও সত্তা শ্রেণিবিহীন একটি টেবিল। অতিরিক্ত বৈশিষ্ট্য সহ এ জাতীয় যোগদানের টেবিলের সাথে কাজ করতে আপনাকে আসলে দুটি এক থেকে বহু সম্পর্ক তৈরি করতে হবে। এটি দেখতে এটি দেখতে পারে:

public class Member
{
    public int MemberID { get; set; }

    public string FirstName { get; set; }
    public string LastName { get; set; }

    public virtual ICollection<MemberComment> MemberComments { get; set; }
}

public class Comment
{
    public int CommentID { get; set; }
    public string Message { get; set; }

    public virtual ICollection<MemberComment> MemberComments { get; set; }
}

public class MemberComment
{
    [Key, Column(Order = 0)]
    public int MemberID { get; set; }
    [Key, Column(Order = 1)]
    public int CommentID { get; set; }

    public virtual Member Member { get; set; }
    public virtual Comment Comment { get; set; }

    public int Something { get; set; }
    public string SomethingElse { get; set; }
}

আপনি যদি এখন LastName= "স্মিথ" এর সাথে সদস্যদের সমস্ত মন্তব্য সন্ধান করতে চান তবে আপনি এই জাতীয় একটি কোয়েরি লিখতে পারেন:

var commentsOfMembers = context.Members
    .Where(m => m.LastName == "Smith")
    .SelectMany(m => m.MemberComments.Select(mc => mc.Comment))
    .ToList();

... বা ...

var commentsOfMembers = context.MemberComments
    .Where(mc => mc.Member.LastName == "Smith")
    .Select(mc => mc.Comment)
    .ToList();

অথবা "স্মিথ" নামের সদস্যদের একটি তালিকা তৈরি করার জন্য (আমরা ধরে নিই যে সেখানে একের বেশি রয়েছে) তাদের মন্তব্য সহ আপনি একটি প্রক্ষেপণ ব্যবহার করতে পারেন:

var membersWithComments = context.Members
    .Where(m => m.LastName == "Smith")
    .Select(m => new
    {
        Member = m,
        Comments = m.MemberComments.Select(mc => mc.Comment)
    })
    .ToList();

আপনি যদি MemberId1 এর সাথে একজন সদস্যের সমস্ত মন্তব্য সন্ধান করতে চান :

var commentsOfMember = context.MemberComments
    .Where(mc => mc.MemberId == 1)
    .Select(mc => mc.Comment)
    .ToList();

এখন আপনি নিজের যোগদানের টেবিলের বৈশিষ্ট্যগুলিও ফিল্টার করতে পারেন (যা বহু-বহু সম্পর্কের ক্ষেত্রে সম্ভব হবে না), উদাহরণস্বরূপ: সদস্য 1 এর সমস্ত মন্তব্য ফিল্টার করুন যেখানে সম্পত্তি রয়েছে 99 Something:

var filteredCommentsOfMember = context.MemberComments
    .Where(mc => mc.MemberId == 1 && mc.Something == 99)
    .Select(mc => mc.Comment)
    .ToList();

কারণ অলস লোডিং জিনিসগুলি সহজ হয়ে উঠতে পারে। আপনার যদি বোঝা হয়ে থাকে তবে Memberআপনি একটি স্পষ্ট জিজ্ঞাসা ছাড়াই মন্তব্যগুলি পেতে সক্ষম হবেন:

var commentsOfMember = member.MemberComments.Select(mc => mc.Comment);

আমি অনুমান করি যে অলস লোডিংগুলি পর্দার আড়ালে স্বয়ংক্রিয়ভাবে মন্তব্যগুলি এনে দেবে।

সম্পাদন করা

কেবল মজাদার জন্য সত্তা এবং সম্পর্কগুলি কীভাবে যুক্ত করতে হয় এবং কীভাবে এই মডেলটিতে সেগুলি মুছতে হয় তার কয়েকটি উদাহরণ fun

1) এই সদস্যের একজন সদস্য এবং দুটি মন্তব্য তৈরি করুন:

var member1 = new Member { FirstName = "Pete" };
var comment1 = new Comment { Message = "Good morning!" };
var comment2 = new Comment { Message = "Good evening!" };
var memberComment1 = new MemberComment { Member = member1, Comment = comment1,
                                         Something = 101 };
var memberComment2 = new MemberComment { Member = member1, Comment = comment2,
                                         Something = 102 };

context.MemberComments.Add(memberComment1); // will also add member1 and comment1
context.MemberComments.Add(memberComment2); // will also add comment2

context.SaveChanges();

২) সদস্যের তৃতীয় মন্তব্য যুক্ত করুন:

var member1 = context.Members.Where(m => m.FirstName == "Pete")
    .SingleOrDefault();
if (member1 != null)
{
    var comment3 = new Comment { Message = "Good night!" };
    var memberComment3 = new MemberComment { Member = member1,
                                             Comment = comment3,
                                             Something = 103 };

    context.MemberComments.Add(memberComment3); // will also add comment3
    context.SaveChanges();
}

3) নতুন সদস্য তৈরি করুন এবং এটি বিদ্যমান মন্তব্যের সাথে সম্পর্কিত করুন 2:

var comment2 = context.Comments.Where(c => c.Message == "Good evening!")
    .SingleOrDefault();
if (comment2 != null)
{
    var member2 = new Member { FirstName = "Paul" };
    var memberComment4 = new MemberComment { Member = member2,
                                             Comment = comment2,
                                             Something = 201 };

    context.MemberComments.Add(memberComment4);
    context.SaveChanges();
}

4) বিদ্যমান সদস্য 2 এবং মন্তব্য 3 এর মধ্যে সম্পর্ক তৈরি করুন:

var member2 = context.Members.Where(m => m.FirstName == "Paul")
    .SingleOrDefault();
var comment3 = context.Comments.Where(c => c.Message == "Good night!")
    .SingleOrDefault();
if (member2 != null && comment3 != null)
{
    var memberComment5 = new MemberComment { Member = member2,
                                             Comment = comment3,
                                             Something = 202 };

    context.MemberComments.Add(memberComment5);
    context.SaveChanges();
}

5) এই সম্পর্কটি আবার মুছুন:

var memberComment5 = context.MemberComments
    .Where(mc => mc.Member.FirstName == "Paul"
        && mc.Comment.Message == "Good night!")
    .SingleOrDefault();
if (memberComment5 != null)
{
    context.MemberComments.Remove(memberComment5);
    context.SaveChanges();
}

6) সদস্যের 1 এবং এর সমস্ত সম্পর্কের মন্তব্যে মুছুন:

var member1 = context.Members.Where(m => m.FirstName == "Pete")
    .SingleOrDefault();
if (member1 != null)
{
    context.Members.Remove(member1);
    context.SaveChanges();
}

এই সম্পর্ক মুছে ফেলে MemberCommentsখুব কারণ মধ্যে একের সাথে অধিকের সম্পর্ক Memberএবং MemberCommentsমধ্যে Commentএবং MemberCommentsকনভেনশন দ্বারা ডিলিট ক্যাসকেডিং সঙ্গে সেটআপ হয়। এবং এই ক্ষেত্রে কারণ MemberIdএবং CommentIdমধ্যে MemberCommentবিদেশি কী বৈশিষ্ট্য হিসাবে সনাক্ত করা হয় Memberএবং Commentনেভিগেশন এড়িয়ে বৈশিষ্ট্য এবং এফ কে বৈশিষ্ট্য যেহেতু টাইপ অ nullable হয় intসম্পর্ক প্রয়োজন বোধ করা হয় অবশেষে ক্যাসকেডিং-Delete সেটআপ ঘটায়। আমি মনে করি এই মডেলটি উপলব্ধি করে I


1
ধন্যবাদ. আপনার দেওয়া অতিরিক্ত তথ্যের অনেক প্রশংসা করুন।
এইচজিডিয়ান

7
@ হিগডিয়ান: আমি আরও কয়েকটি উদাহরণ স্প্যাম করেছি, দুঃখিত, তবে এটি একটি আকর্ষণীয় মডেল এবং যোগদানের টেবিলের অতিরিক্ত তথ্য সহ অনেকগুলি থেকে অনেকের প্রশ্ন এখনই এবং পরে এখানে উপস্থিত হয়। এখন পরবর্তী বারের জন্য আমার সাথে কিছু যুক্ত করার দরকার আছে ... :)
স্লুমা

4
@ ইস্তেবান: কোনও ওভাররাইড নেই OnModelCreating। উদাহরণটি কেবল ম্যাপিং কনভেনশন এবং ডেটা টীকাতে নির্ভর করে।
স্লুমা

4
দ্রষ্টব্য: আপনি যদি ফ্লুয়েন্ট এপিআই ব্যতীত এই পদ্ধতির ব্যবহার করেন তবে নিশ্চিত হয়ে নিন যে আপনার ডাটাবেসে পরীক্ষা করে দেখুন যে আপনার কাছে কেবল একটি সংমিশ্রিত কী MemberIdএবং CommentIdকলাম রয়েছে এবং অতিরিক্ত তৃতীয় কলাম নেই Member_CommentId(বা এর মতো কিছু) - যার অর্থ আপনার সঠিক মিল নেই didn't আপনার কীগুলির জন্য অবজেক্টগুলি জুড়ে
সাইমন_উইভার

3
@ সিমন_উইভার (বা যে কেউ উত্তরটি জানতে পারে) আমারও একই অবস্থা তবে আমি এই টেবিলের জন্য "মেম্বারকমেন্টআইডি" প্রাথমিক কীটি পেতে চাই, এটি কি সম্ভব নাকি? আমি বর্তমানে পেয়ে করছি একটি ব্যতিক্রম, দয়া করে আমার প্রশ্নের কটাক্ষপাত করা, আমি সত্যিই প্রয়োজন সাহায্যের ... stackoverflow.com/questions/26783934/...
duxfox--

97

চমৎকার Slauma দ্বারা উত্তর।

আমি সাবলীল ব্যবহার করে এটি করার জন্য কোডটি পোস্ট করব এপিআই ম্যাপিং ।

public class User {
    public int UserID { get; set; }
    public string Username { get; set; }
    public string Password { get; set; }

    public ICollection<UserEmail> UserEmails { get; set; }
}

public class Email {
    public int EmailID { get; set; }
    public string Address { get; set; }

    public ICollection<UserEmail> UserEmails { get; set; }
}

public class UserEmail {
    public int UserID { get; set; }
    public int EmailID { get; set; }
    public bool IsPrimary { get; set; }
}

আপনার DbContextউদ্ভূত শ্রেণিতে আপনি এটি করতে পারেন:

public class MyContext : DbContext {
    protected override void OnModelCreating(DbModelBuilder builder) {
        // Primary keys
        builder.Entity<User>().HasKey(q => q.UserID);
        builder.Entity<Email>().HasKey(q => q.EmailID);
        builder.Entity<UserEmail>().HasKey(q => 
            new { 
                q.UserID, q.EmailID
            });

        // Relationships
        builder.Entity<UserEmail>()
            .HasRequired(t => t.Email)
            .WithMany(t => t.UserEmails)
            .HasForeignKey(t => t.EmailID)

        builder.Entity<UserEmail>()
            .HasRequired(t => t.User)
            .WithMany(t => t.UserEmails)
            .HasForeignKey(t => t.UserID)
    }
}

এটি একটি ভিন্ন পদ্ধতির সাথে স্বীকৃত উত্তরের মতো একই প্রভাব ফেলবে, যা নেই ভাল না খারাপ।

সম্পাদনা: আমি ক্রেডিটডেটকে বুলে থেকে ডেটটাইমে পরিবর্তন করেছি।

সম্পাদনা 2: সময়ের অভাবের কারণে আমি যে অ্যাপ্লিকেশনটিতে কাজ করছি তার একটি উদাহরণ রেখেছি যাতে এটি কাজ করে তা নিশ্চিত হতে পারে।


1
আমি মনে করি এটি ভুল। আপনি এখানে এম: এম সম্পর্ক তৈরি করছেন যেখানে উভয় সত্তার জন্য এটির জন্য 1: এম হওয়া দরকার।
সিএইচএস

1
@CHS In your classes you can easily describe a many to many relationship with properties that point to each other.থেকে নেওয়া: msdn.microsoft.com/en-us/data/hh134698.aspx । জুলি লারম্যান ভুল হতে পারে না।
Esteban

1
আসলে, সম্পর্কের ম্যাপিং সত্যিই ভুল। @ সিএইচএস এই সম্পর্কে সঠিক। জুলি লারম্যান একটি "সত্য" বহু-থেকে-বহু সম্পর্কের কথা বলছেন যখন আমাদের কাছে এমন একটি মডেলের উদাহরণ রয়েছে যা অনেকগুলি থেকে অনেকের মতো ম্যাপ করা যায় না। আপনার ম্যাপিং এমনকি সংকলন করবে না কারণ আপনার কোনও Commentsসম্পত্তি নেই Member। এবং আপনি কেবলমাত্র HasManyকলটির নাম পরিবর্তন করে এটি ঠিক করতে পারবেন না MemberCommentsকারণ MemberCommentসত্তার পক্ষে কোনও বিপরীত সংগ্রহ নেই WithMany। সত্যিকারের ম্যাপিংয়ের জন্য আপনাকে দুটি এক থেকে একাধিক সম্পর্ক কনফিগার করতে হবে।
স্লুমা

2
ধন্যবাদ. অনেকগুলি-ম্যাপিংয়ের জন্য আমি এই সমাধানটি অনুসরণ করেছি।
টমাস। বেঞ্জ

আমি জানি না তবে এটি মাইএসকিএল-এর সাথে আরও ভাল কাজ করে। নির্মাতাকে ছাড়া, মাইগ্রেশনটি চেষ্টা করার সময় মাইএসকিএল আমাকে একটি ত্রুটি ছুড়ে দেয়।
রদ্রিগো প্রিয়তো

11

@ ইস্টবান, আপনার প্রদত্ত কোডটি সঠিক, ধন্যবাদ, তবে অসম্পূর্ণ, আমি এটি পরীক্ষা করেছি। "ইউজারইমেল" শ্রেণিতে অনুপস্থিত বৈশিষ্ট্য রয়েছে:

    public UserTest UserTest { get; set; }
    public EmailTest EmailTest { get; set; }

যদি কেউ আগ্রহী হয় তবে আমি পরীক্ষিত কোডটি পোস্ট করি। শুভেচ্ছা সহ

using System.Data.Entity;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Web;

#region example2
public class UserTest
{
    public int UserTestID { get; set; }
    public string UserTestname { get; set; }
    public string Password { get; set; }

    public ICollection<UserTestEmailTest> UserTestEmailTests { get; set; }

    public static void DoSomeTest(ApplicationDbContext context)
    {

        for (int i = 0; i < 5; i++)
        {
            var user = context.UserTest.Add(new UserTest() { UserTestname = "Test" + i });
            var address = context.EmailTest.Add(new EmailTest() { Address = "address@" + i });
        }
        context.SaveChanges();

        foreach (var user in context.UserTest.Include(t => t.UserTestEmailTests))
        {
            foreach (var address in context.EmailTest)
            {
                user.UserTestEmailTests.Add(new UserTestEmailTest() { UserTest = user, EmailTest = address, n1 = user.UserTestID, n2 = address.EmailTestID });
            }
        }
        context.SaveChanges();
    }
}

public class EmailTest
{
    public int EmailTestID { get; set; }
    public string Address { get; set; }

    public ICollection<UserTestEmailTest> UserTestEmailTests { get; set; }
}

public class UserTestEmailTest
{
    public int UserTestID { get; set; }
    public UserTest UserTest { get; set; }
    public int EmailTestID { get; set; }
    public EmailTest EmailTest { get; set; }
    public int n1 { get; set; }
    public int n2 { get; set; }


    //Call this code from ApplicationDbContext.ConfigureMapping
    //and add this lines as well:
    //public System.Data.Entity.DbSet<yournamespace.UserTest> UserTest { get; set; }
    //public System.Data.Entity.DbSet<yournamespace.EmailTest> EmailTest { get; set; }
    internal static void RelateFluent(System.Data.Entity.DbModelBuilder builder)
    {
        // Primary keys
        builder.Entity<UserTest>().HasKey(q => q.UserTestID);
        builder.Entity<EmailTest>().HasKey(q => q.EmailTestID);

        builder.Entity<UserTestEmailTest>().HasKey(q =>
            new
            {
                q.UserTestID,
                q.EmailTestID
            });

        // Relationships
        builder.Entity<UserTestEmailTest>()
            .HasRequired(t => t.EmailTest)
            .WithMany(t => t.UserTestEmailTests)
            .HasForeignKey(t => t.EmailTestID);

        builder.Entity<UserTestEmailTest>()
            .HasRequired(t => t.UserTest)
            .WithMany(t => t.UserTestEmailTests)
            .HasForeignKey(t => t.UserTestID);
    }
}
#endregion

3

আমি একটি সমাধান প্রস্তাব করতে চাই যেখানে বহু থেকে বহু কনফিগারেশনের উভয় স্বাদই অর্জন করা যায়।

"ক্যাচ" হ'ল আমাদের এমন একটি দৃষ্টিভঙ্গি তৈরি করা দরকার যা যোগদানের সারণিকে লক্ষ্যবস্তু করে, যেহেতু EF যাচাই করে যে কোনও স্কিমার টেবিল প্রতি একবারে ম্যাপ করা যেতে পারে EntitySet

এই উত্তরটি পূর্ববর্তী উত্তরে ইতিমধ্যে যা বলা হয়েছে তার সাথে যুক্ত করে এবং এই পদ্ধতির কোনওটিতে ওভাররাইড হয় না, এটি তাদের উপর ভিত্তি করে।

মডেলটি:

public class Member
{
    public int MemberID { get; set; }

    public string FirstName { get; set; }
    public string LastName { get; set; }

    public virtual ICollection<Comment> Comments { get; set; }
    public virtual ICollection<MemberCommentView> MemberComments { get; set; }
}

public class Comment
{
    public int CommentID { get; set; }
    public string Message { get; set; }

    public virtual ICollection<Member> Members { get; set; }
    public virtual ICollection<MemberCommentView> MemberComments { get; set; }
}

public class MemberCommentView
{
    public int MemberID { get; set; }
    public int CommentID { get; set; }
    public int Something { get; set; }
    public string SomethingElse { get; set; }

    public virtual Member Member { get; set; }
    public virtual Comment Comment { get; set; }
}

কনফিগারেশন:

using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity.ModelConfiguration;

public class MemberConfiguration : EntityTypeConfiguration<Member>
{
    public MemberConfiguration()
    {
        HasKey(x => x.MemberID);

        Property(x => x.MemberID).HasColumnType("int").IsRequired();
        Property(x => x.FirstName).HasColumnType("varchar(512)");
        Property(x => x.LastName).HasColumnType("varchar(512)")

        // configure many-to-many through internal EF EntitySet
        HasMany(s => s.Comments)
            .WithMany(c => c.Members)
            .Map(cs =>
            {
                cs.ToTable("MemberComment");
                cs.MapLeftKey("MemberID");
                cs.MapRightKey("CommentID");
            });
    }
}

public class CommentConfiguration : EntityTypeConfiguration<Comment>
{
    public CommentConfiguration()
    {
        HasKey(x => x.CommentID);

        Property(x => x.CommentID).HasColumnType("int").IsRequired();
        Property(x => x.Message).HasColumnType("varchar(max)");
    }
}

public class MemberCommentViewConfiguration : EntityTypeConfiguration<MemberCommentView>
{
    public MemberCommentViewConfiguration()
    {
        ToTable("MemberCommentView");
        HasKey(x => new { x.MemberID, x.CommentID });

        Property(x => x.MemberID).HasColumnType("int").IsRequired();
        Property(x => x.CommentID).HasColumnType("int").IsRequired();
        Property(x => x.Something).HasColumnType("int");
        Property(x => x.SomethingElse).HasColumnType("varchar(max)");

        // configure one-to-many targeting the Join Table view
        // making all of its properties available
        HasRequired(a => a.Member).WithMany(b => b.MemberComments);
        HasRequired(a => a.Comment).WithMany(b => b.MemberComments);
    }
}

প্রসঙ্গ:

using System.Data.Entity;

public class MyContext : DbContext
{
    public DbSet<Member> Members { get; set; }
    public DbSet<Comment> Comments { get; set; }
    public DbSet<MemberCommentView> MemberComments { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Configurations.Add(new MemberConfiguration());
        modelBuilder.Configurations.Add(new CommentConfiguration());
        modelBuilder.Configurations.Add(new MemberCommentViewConfiguration());

        OnModelCreatingPartial(modelBuilder);
     }
}

সালুমার (@ সালুমা) থেকে উত্তর থেকে

আপনি যদি এখন সর্বশেষ নাম = "স্মিথ" সহ সদস্যদের সমস্ত মন্তব্য সন্ধান করতে চান তবে উদাহরণস্বরূপ আপনি এই জাতীয় একটি কোয়েরি লিখতে পারেন:

এটি এখনও কাজ করে ...

var commentsOfMembers = context.Members
    .Where(m => m.LastName == "Smith")
    .SelectMany(m => m.MemberComments.Select(mc => mc.Comment))
    .ToList();

... কিন্তু এখন হতে পারে ...

var commentsOfMembers = context.Members
    .Where(m => m.LastName == "Smith")
    .SelectMany(m => m.Comments)
    .ToList();

অথবা "স্মিথ" নামের সদস্যদের একটি তালিকা তৈরি করার জন্য (আমরা ধরে নিই যে সেখানে একের বেশি রয়েছে) তাদের মন্তব্য সহ আপনি একটি প্রক্ষেপণ ব্যবহার করতে পারেন:

এটি এখনও কাজ করে ...

var membersWithComments = context.Members
    .Where(m => m.LastName == "Smith")
    .Select(m => new
    {
        Member = m,
        Comments = m.MemberComments.Select(mc => mc.Comment)
    })
    .ToList();

... কিন্তু এখন হতে পারে ...

var membersWithComments = context.Members
    .Where(m => m.LastName == "Smith")
    .Select(m => new
    {
        Member = m,
        m.Comments
    })
        .ToList();

আপনি যদি কোনও সদস্যের একটি মন্তব্য মুছে ফেলতে চান তবে

var comment = ... // assume comment from member John Smith
var member = ... // assume member John Smith

member.Comments.Remove(comment);

আপনি যদি Include()কোনও সদস্যের মন্তব্য করতে চান

var member = context.Members
    .Where(m => m.FirstName == "John", m.LastName == "Smith")
    .Include(m => m.Comments);

এগুলি সমস্ত সিনট্যাকটিক চিনির মতো অনুভূত হয়, তবে আপনি অতিরিক্ত কনফিগারেশনের মধ্য দিয়ে যেতে ইচ্ছুক হলে এটি আপনাকে কিছু সুবিধা দেয়। যে কোনও উপায়েই আপনি উভয় পদ্ধতির সেরা অর্জন করতে সক্ষম হবেন বলে মনে হয়।


আমি লিনকিউ কোয়েরিগুলি টাইপ করার সময় বর্ধিত পাঠযোগ্যতার প্রশংসা করি। আমাকে কেবল এই পদ্ধতিটি গ্রহণ করতে হবে। আমাকে জিজ্ঞাসা করতে হবে, EF এনটিটিসেটটি স্বয়ংক্রিয়ভাবে ডাটাবেসেও ভিউ আপডেট করে? EF5.0 পরিকল্পনায় বর্ণিত [চিনির] সাথে অনুরূপ বলে মনে হয় আপনি কি সম্মত হন? github.com/dotnet/EntityFramework.Docs/blob/master/…
Krptodr

আমি ভাবছি কেন আপনি EntityTypeConfiguration<EntityType>সত্তার ধরণের কী এবং বৈশিষ্ট্যগুলিকে নতুন করে সংজ্ঞায়িত করছেন বলে মনে হচ্ছে । উদাহরণস্বরূপ Property(x => x.MemberID).HasColumnType("int").IsRequired();মনে হয় নিরর্থক public int MemberID { get; set; }। দয়া করে আমার বিভ্রান্তিকর বোঝাপড়াটি সাফ করতে পারবেন?
মিনিট

0

TLDR; (EF6 / VS2012U5 এ কোনও EF সম্পাদক বাগের সাথে আধা-সম্পর্কিত) আপনি যদি ডিবি থেকে মডেলটি উত্পাদন করেন এবং আপনি এম: মি টেবিলটি দেখতে না পান: দুটি সম্পর্কিত টেবিল মুছুন -> সংরক্ষণ করুন .edmx -> ডাটাবেস থেকে জেনারেট / অ্যাড করুন - > সংরক্ষণ করুন।

EF .edmx ফাইলে দেখানোর জন্য কীভাবে অ্যাট্রিবিউট কলামগুলির সাথে একাধিক থেকে অনেক বেশি সম্পর্ক পেতে যায় তা ভাবতে যারা এখানে এসেছিলেন (যেমন এটি বর্তমানে নাভিগেশনাল বৈশিষ্ট্যের একটি সেট হিসাবে প্রদর্শিত হবে না এবং বিবেচিত হবে) এবং আপনি এই ক্লাসগুলি তৈরি করেছেন আপনার ডাটাবেস টেবিল থেকে (বা এমএস লিঙ্গোতে প্রথম ডাটাবেস, আমি বিশ্বাস করি))

আপনার .edmx এ প্রশ্নের 2 টি টেবিল (ওপি উদাহরণ, সদস্য এবং মন্তব্য নিতে) মুছুন এবং তাদের আবার 'ডেটাবেস থেকে মডেল উত্পন্ন করুন' এর মাধ্যমে যুক্ত করুন। (অর্থাত্ ভিজ্যুয়াল স্টুডিওগুলি সেগুলি আপডেট করার চেষ্টা করবেন না - মুছুন, সংরক্ষণ করুন, যোগ করুন, সংরক্ষণ করুন)

এরপরে এটি এখানে প্রস্তাবিত অনুসারে 3 য় টেবিল তৈরি করবে।

প্রথমে খাঁটি বহু থেকে বহু সম্পর্ক যুক্ত হওয়ার ক্ষেত্রে এটি প্রাসঙ্গিক এবং বৈশিষ্ট্যগুলি পরে ডিবিতে নকশা করা হয়েছে।

এটি এই থ্রেড / গুগলিং থেকে তাত্ক্ষণিকভাবে পরিষ্কার হয়নি। গুগলে এই লিঙ্ক # 1 হ'ল এটি কেবল এটি বাইরে রেখেই সমস্যাটি খুঁজছেন তবে প্রথমে ডিবি পক্ষ থেকে আসছেন।


0

এই ত্রুটিটি সমাধান করার একটি উপায় হ'ল এটি put ForeignKey বিদেশী কী হিসাবে আপনার পছন্দসই সম্পত্তিটির উপরে বৈশিষ্ট্যটির উপরে থাকা এবং নেভিগেশন সম্পত্তি যুক্ত করা।

দ্রষ্টব্য: প্রথম ForeignKeyবন্ধনী এবং ডাবল উদ্ধৃতিগুলির মধ্যে অ্যাট্রিবিউটে, শ্রেণিটির নামটি এভাবে উল্লেখ করুন।

এখানে চিত্র বর্ণনা লিখুন


দয়া করে উত্তরের একটি ন্যূনতম ব্যাখ্যা যুক্ত করুন, কারণ সরবরাহিত লিঙ্কটি ভবিষ্যতে অনুপলব্ধ হতে পারে।
n4m31ess_c0d3r

2
এটি ক্লাসের পরিবর্তে নেভিগেশন সম্পত্তির নাম হওয়া উচিত ।
আরোন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.