EF কোডটি ব্যবহার করে সম্মিলিত কী ম্যাপিং


115

SQL সার্ভার টেবিল:

SomeId PK varchar(50) not null 
OtherId PK int not null

EF 6 কোডে আমি কীভাবে এটি মানচিত্র করব?

public class MyTable
{
    [Key]
    public string SomeId { get; set; }

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

আমি কয়েকটি উদাহরণ দেখেছি যেখানে আপনাকে প্রতিটি কলামের জন্য অর্ডার সেট করতে হবে, এটি কি প্রয়োজনীয়?

এটি নিয়ে কোথাও অফিসিয়াল ডকুমেন্টেশন রয়েছে?


কি SomeIdএকটি stringঅথবা একটি int?
কোরি অ্যাডলার

@ আয়রনম্যান ৮৮ এটি একটি স্ট্রিং, আমি এটি ঠিক করব।
অনুগতপ্রবাহ

উত্তর:


187

আপনাকে অবশ্যই কলামের ক্রম স্থাপন করা দরকার, অন্যথায় এসকিউএল সার্ভারটি কোনটি প্রথমে যায় তা জেনে থাকার কীভাবে হয়? আপনার কোডে আপনাকে যা করতে হবে তা এখানে:

public class MyTable
{
  [Key, Column(Order = 0)]
  public string SomeId { get; set; }

  [Key, Column(Order = 1)]
  public int OtherId { get; set; }
}

আপনি এই এসও প্রশ্নটিও দেখতে পারেন । আপনি যদি অফিশিয়াল ডকুমেন্টেশন চান তবে আমি অফিসিয়াল ইএফ ওয়েবসাইট দেখার পরামর্শ দিচ্ছি । আশাকরি এটা সাহায্য করবে.

সম্পাদনা: আমি জুলি লারম্যানের কাছ থেকে সমস্ত ধরণের ইএফ 6 ধার্মিকতার লিঙ্ক সহ একটি ব্লগ পোস্ট পেয়েছি। আপনি এখানে যা প্রয়োজন তা খুঁজে পেতে পারেন ।


আপনি কীভাবে এটি একটি এনটিটি কনফিগারেশনের মাধ্যমে করবেন? যোগদানের টেবিলের জন্য আমার আসলে কোনও সত্তা নেই ... ম্যাপিংটি সেট আপ করার জন্য আমার কাছে কেবল দুটি সত্তা এবং একটি এনটিটি কনফিগারেশন রয়েছে ap
মীর

31
otherwise how is SQL Server supposed to know which one goes first?- কেন এটি অন্য প্রতিটি কলামের ক্রমটি জানেন না?
Davor

1
EF অন্যান্য কলামগুলির ক্রম জানেন না, আপনি যতক্ষণ নাম নির্দিষ্ট করে নিচ্ছেন ততক্ষণ কোনও ক্রমে কলাম সহ সন্নিবেশ করতে পারেন। যদি EF যৌগিক পিকে জন্য আদেশের প্রয়োজন হয় তবে তা সূচকের সাথে সম্পর্কিত হতে হবে।
সিলভাইন গ্যান্টোইস

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

47

সত্তা ফ্রেমওয়ার্ক ব্যবহার করে সম্মিলিত প্রাথমিক কী ম্যাপিংয়ের জন্য আমরা দুটি পদ্ধতির ব্যবহার করতে পারি।

1) অনমোডেলক্রিয়াটিং () পদ্ধতিটি ওভাররাইড করে

উদাহরণস্বরূপ: নীচে দেখানো হিসাবে আমার কাছে VehicleFeature নামে মডেল ক্লাস রয়েছে।

public class VehicleFeature
{
    public int VehicleId { get; set; }
    public int FeatureId{get;set;}
    public Vehicle Vehicle{get;set;}
    public Feature Feature{get;set;}
}

আমার ডিবিসিএন্টেক্সটে কোডটি এমন হবে,

public class VegaDbContext : DbContext
{
    public DbSet<Make> Makes{get;set;}

    public DbSet<Feature> Features{get;set;}
    public VegaDbContext(DbContextOptions<VegaDbContext> options):base(options)        
    {           

    }
    // we override the OnModelCreating method here.
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<VehicleFeature>().HasKey(vf=> new {vf.VehicleId, vf.FeatureId});
    }
}

2) ডেটা টিকা দ্বারা।

public class VehicleFeature
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]  
    [Key]
    public int VehicleId { get; set; }
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]   
    [Key]
    public int FeatureId{get;set;}
    public Vehicle Vehicle{get;set;}
    public Feature Feature{get;set;}
}

আরও তথ্যের জন্য নীচের লিঙ্কগুলি দেখুন।

1) https://msdn.microsoft.com/en-us/library/jj591617(v=vs.113).aspx

2) EF 6 ফ্লুয়েন্ট এপি ব্যবহার করে একটি সংমিশ্রিত অনন্য কী কীভাবে যুক্ত করবেন?


5
EF কোর এর জন্য এফওয়াইআই, বিকল্প # 2 সম্ভব নয় , "কম্পোজিট কীগুলি কেবল ফ্লুয়েন্ট এপিআই ব্যবহার করে কনফিগার করা যায় - কনভেনশনগুলি কখনই একটি সমন্বিত কী সেটআপ করতে পারে না এবং আপনি কোনও কনফিগার করার জন্য ডেটা টীকাগুলি ব্যবহার করতে পারবেন না।"
টোবিয়াস জে

7

কনফিগারেশনের মাধ্যমে আপনি এটি করতে পারেন:

Model1
{
    int fk_one,
    int fk_two
}

Model2
{
    int pk_one,
    int pk_two,
}

তারপরে কনটেক্সট কনফিগারেশনে

public class MyContext : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Model1>()
            .HasRequired(e => e.Model2)
            .WithMany(e => e.Model1s)
            .HasForeignKey(e => new { e.fk_one, e.fk_two })
            .WillCascadeOnDelete(false);
    }
}

প্রসঙ্গে কনফিগার কোথায়?
চার্লি

আপনি যদি সাবলীল এপিআই ব্যবহার করে কোডের মাধ্যমে প্রসঙ্গটি কনফিগার করছেন ... বিভাগ 7 । পাবলিক ক্লাস মাইকনেক্সটেক্সট: ডিবিসিঙ্কটেক্সট {সুরক্ষিত ওভাররাইড শূন্যতম অনমোডেল ক্রিশিং (ডিবিমডেলবিল্ডার মডেলবিল্ডার) {মডেলবিল্ডার Eমান্তি <মডেল 1> () .হাসআরচায়িত (ই => ই। মডেল 2) .সথামি {e.fk_one, e.fk_two})। উইলক্যাসকেডঅনডিলিট (মিথ্যা); }}
ফিলান

আমি দেখতে পেলাম যে ডটনেট কোরে আমাকে ডিবিমোডেলবিল্ডারের পরিবর্তে মডেলবিল্ডার ব্যবহার করতে হবে।
kiml42

6

আমি ভেবেছিলাম যে শীর্ষস্থানীয় গুগল অনুসন্ধান ফলাফল হওয়ায় আমি এই প্রশ্নটিতে যুক্ত করব।

মন্তব্যে যেমন উল্লেখ করা হয়েছে, ইএফ কোরটিতে টীকাগুলি (কী বৈশিষ্ট্য) ব্যবহারের জন্য কোনও সমর্থন নেই এবং এটি অবশ্যই সাবলীলভাবে করা উচিত।

যেহেতু আমি ইএফ 6 থেকে ইএফ কোর-তে একটি বড় মাইগ্রেশন নিয়ে কাজ করছিলাম এটি অস্বাস্থ্যকর ছিল এবং তাই আমি মূল বৈশিষ্ট্যটি সন্ধান করতে প্রতিবিম্বটি ব্যবহার করে এটি হ্যাক করার চেষ্টা করেছি এবং তারপরে এটি অনমোডেল ক্রিয়েটিংয়ের সময় প্রয়োগ করেছি

// get all composite keys (entity decorated by more than 1 [Key] attribute
foreach (var entity in modelBuilder.Model.GetEntityTypes()
    .Where(t => 
        t.ClrType.GetProperties()
            .Count(p => p.CustomAttributes.Any(a => a.AttributeType == typeof(KeyAttribute))) > 1))
{
    // get the keys in the appropriate order
    var orderedKeys = entity.ClrType
        .GetProperties()
        .Where(p => p.CustomAttributes.Any(a => a.AttributeType == typeof(KeyAttribute)))
        .OrderBy(p => 
            p.CustomAttributes.Single(x => x.AttributeType == typeof(ColumnAttribute))?
                .NamedArguments?.Single(y => y.MemberName == nameof(ColumnAttribute.Order))
                .TypedValue.Value ?? 0)
        .Select(x => x.Name)
        .ToArray();

    // apply the keys to the model builder
    modelBuilder.Entity(entity.ClrType).HasKey(orderedKeys);
}

আমি সমস্ত পরিস্থিতিতে এটির পুরোপুরি পরীক্ষা করিনি, তবে এটি আমার বেসিক পরীক্ষায় কাজ করে। আশা করি এটি কাউকে সাহায্য করবে

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