पहले 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?
कोरी एडलर

@ IronMan84 यह एक स्ट्रिंग है, मैं इसे ठीक कर दूंगा।
19

जवाबों:


187

आपको निश्चित रूप से कॉलम ऑर्डर में डालने की आवश्यकता है, अन्यथा SQL सर्वर को कैसे पता होना चाहिए कि कौन सा पहले जाता है? यहां आपको अपने कोड में क्या करना होगा:

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

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

आप इस SO प्रश्न को भी देख सकते हैं । यदि आप आधिकारिक दस्तावेज चाहते हैं, तो मैं आधिकारिक ईएफ वेबसाइट देखने की सलाह दूंगा । उम्मीद है की यह मदद करेगा।

संपादित करें: मैं सिर्फ जूली लर्मन के सभी प्रकार के EF 6 अच्छाई के लिंक के साथ एक ब्लॉग पोस्ट पाया। आपको यहां जो कुछ भी चाहिए, वह मिल सकता है


एक EntityConfiguration के माध्यम से आप यह कैसे करते हैं? मेरे पास वास्तव में ज्वाइन टेबल के लिए कोई इकाई नहीं है ... मेरे पास केवल दो इकाइयाँ हैं और उनमें से एक पर एक EntityConfiguration .Map () मैपिंग सेट करने के लिए है।
मीर

31
otherwise how is SQL Server supposed to know which one goes first?- उसी तरह क्यों नहीं जो हर दूसरे कॉलम के लिए ऑर्डर जानता है?
डावोर

1
EF अन्य स्तंभों के क्रम को नहीं जानता है, आप किसी भी क्रम में स्तंभों के साथ सम्मिलित कर सकते हैं जब तक कि नाम निर्दिष्ट न हों। यदि EF को समग्र PK के लिए आदेश की आवश्यकता होती है तो उसे अनुक्रमण से संबंधित होना चाहिए।
सिल्वेन गेंटोइस

@ मुझे लगता है कि EF रचनाकारों ने अनुमान लगाने के लिए कुंजी / स्तंभ क्रम में प्रतिबिंब का उपयोग किया हो सकता है, लेकिन शायद ऐसा नहीं करने के लिए प्रदर्शन विचार हैं। मैं किसी भी दिन धीमी प्रदर्शन पर विशेष रूप से अपने DAL में डिज़ाइन-टाइम विशिष्टता ले जाऊंगा।
जैकब स्टैम

47

एंटिटी फ्रेमवर्क का उपयोग करते हुए कम्पोजिट प्राथमिक कुंजी को मैप करने के लिए हम दो तरीकों का उपयोग कर सकते हैं।

1) OnModelCreating () विधि को ओवरराइड करके

उदाहरण के लिए: मेरे पास नीचे दिखाए गए अनुसार मॉडल क्लास नाम व्हीकलफ्योर है।

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

मेरे DBContext में कोड जैसा होगा,

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.1138.bx

2) EF 6 धाराप्रवाह Api का उपयोग करके एक समग्र अद्वितीय कुंजी कैसे जोड़ें?


5
ईएफ कोर के लिए FYI, विकल्प # 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 का उपयोग करके कोड के माध्यम से संदर्भ कॉन्फ़िगर कर रहे हैं । सार्वजनिक वर्ग MyContext: DbContext {संरक्षित ओवरराइड शून्य OnModelCreating (DbModelBuilder मॉडलबाली) {modelBuilder.Entity <Model1> () .HasRequired (e => e.Model2) .WithMany (e.Model 1)। {e.fk_one, e.fk_two}) .WillCascadeOnDelete (झूठी); }}
philn5d

मैंने पाया कि मुझे डॉटनेट कोर पर DbModelBuilder के बजाय ModelBuilder का उपयोग करना था।
kiml42

6

मुझे लगा कि मैं इस प्रश्न को जोड़ूंगा क्योंकि यह शीर्ष Google खोज परिणाम है।

जैसा कि टिप्पणियों में उल्लेख किया गया है, ईएफ कोर में एनोटेशन (मुख्य विशेषता) का उपयोग करने के लिए कोई समर्थन नहीं है और इसे धाराप्रवाह किया जाना चाहिए।

जैसा कि मैं EF6 से EF कोर में एक बड़े प्रवासन पर काम कर रहा था, यह अनुपयोगी था और इसलिए मैंने कुंजी विशेषता को देखने के लिए परावर्तन का उपयोग करके इसे हैक करने की कोशिश की और फिर OnModelCreating के दौरान इसे लागू किया

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

मैंने सभी स्थितियों में इसका पूरी तरह से परीक्षण नहीं किया है, लेकिन यह मेरे बुनियादी परीक्षणों में काम करता है। आशा है कि यह किसी की मदद करता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.