11

मैं वर्तमान में अपने डोमेन ऑब्जेक्ट्स के लिए एंटीटी फ्रेमवर्क 4.1 और उसके कोड के पहले दृष्टिकोण के साथ रिपॉजिटरीज को कार्यान्वित करने का प्रयास कर रहा हूं। अब मैं एक डोमेन इकाई "यात्रा" जो एक अद्वितीय पहचानकर्ता प्रकार में समझाया "VoyageNumber"ईएफ 4.1 कोड प्राथमिक कॉम्प्लेक्स टाइप प्राथमिक कुंजी

public class VoyageNumber 
{ 
    private readonly string number; 

    public VoyageNumber(string number) 
    { 
     Validate.NotNull(number, "VoyageNumber is required"); 

     this.number = number; 
    } 

    public string Id 
    { 
     get { return number; } 
    } 

अब मैं एक अपवाद प्राप्त है जब मैं अपने DbContext के विन्यास में ऐसा करते हैं:

modelBuilder.Entity<Voyage>().HasKey<VoyageNumber>(k => k.VoyageNumber); 

संपत्ति 'VoyageNumber' नहीं किया जा इकाई 'Domain.Model.Voyages.Voyage' क्योंकि संपत्ति प्रकार किसी मान्य कुंजी प्रकार नहीं है पर एक प्रमुख संपत्ति के रूप में इस्तेमाल कर सकते हैं। केवल स्केलर प्रकार, स्ट्रिंग और बाइट [] प्रमुख प्रकार समर्थित हैं।

और यह भी मैं इस जब कोशिश:

modelBuilder.Entity<Voyage>().HasKey<string>(k => k.VoyageNumber.Id); 

गुण अभिव्यक्ति 'k => k.VoyageNumber.Id' मान्य नहीं है। सी #: अभिव्यक्ति एक संपत्ति का प्रतिनिधित्व करना चाहिए 'टी => t.MyProperty'

मैं वास्तव में मेरे VoyageNumber कचरा और एक आदिम प्रकार से बदलने के लिए है?

+0

क्या अपवाद संदेश जब आप इस का उपयोग करें:

protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity<TestPaperResult>() .Ignore(t => t.Id) .HasKey(t => new {t.TestPaperId, t.UserId}); } 
भंडार में

modelBuilder.Entity () .HasKey (k = > के। VoyageNumber); – tpeczek

+0

अपवाद संदेशों के साथ प्रश्न को अद्यतन किया गया। – hoetz

+0

अभी भी ईएफ 6.1.3 –

उत्तर

14

यह सीमा है। मुख्य सदस्य केवल इकाई में स्केलर गुण हो सकते हैं। जटिल प्रकार को जटिल संपत्ति के रूप में दर्शाया जाता है जो समर्थित नहीं है।

+0

में मामला क्या शर्म की बात है, तो मुझे लगता है कि मैं पहले कोड पर छोड़ दूंगा, क्योंकि मैं प्राथमिक कुंजी के समावेशन को छोड़ने को तैयार नहीं हूं। – hoetz

+0

मैं स्पष्ट नहीं था। यह इकाई ढांचे की सीमा है। न केवल कोड की सीमा। –

+5

क्या यह अभी भी ईएफ 6 में सच है? मुझे मूल प्रश्नों में प्रलेखित एक ही त्रुटि मिल रही है, इसलिए मुझे लगता है कि कुछ भी नहीं बदला है, लेकिन उम्मीद है कि कुछ कॉन्फ़िगरेशन विकल्प जोड़े गए हैं कि मुझे याद आ रही है। – sellmeadog

0

एक अलग वर्ग के लिए आप अपने डीबीकॉन्टेक्स्ट में "प्राप्त करें" विधि जोड़कर केवल पढ़ने के लिए कामकाज कर सकते हैं जो SqlQuery<> करता है और तालिका को आंतरिक रूप से (पुराने तरीके से) कक्षा में मानचित्र करता है। https://github.com/timabell/ef-complex-pk

उदहारण के लिए:

मैं एक न्यूनतम परीक्षण मामले यहाँ काम किया है

public class TestDbContext : DbContext 
{ 

    public IEnumerable<UberWidget> GetUberWidgets() 
    { 
     return Database.SqlQuery<WidgetSqlDto>("select WidgetId, Name from Widgets") 
      .Select(dto => new UberWidget 
      { 
       UberWidgetId = new IdWrap { IdWrapId = dto.WidgetId }, 
       Name = dto.Name 
      }); 
    } 
} 
0

हम इसे नीचे से हल कर सकते हैं। उम्मीद है कि यह सहायक है।

public class TestPaperResultId: ValueObject 
{ 
    public TestPaperResultId(string testPaperId, string userId) 
    { 
     TestPaperId = testPaperId; 
     UserId = userId; 
    } 

    protected TestPaperResultId() { } 

    public string TestPaperId { get; protected set; } 
    public string UserId { get; protected set; } 

    public override string ToString() 
    { 
     return $"{TestPaperId}_{UserId}"; 
    } 
} 

public class TestPaperResult : AggregateRoot 
{ 
    private TestPaperResultId _id; 

    public TestPaperResultId Id 
    { 
     get => _id ?? (_id = new TestPaperResultId(TestPaperId, UserId)); 
     protected set 
     { 
      TestPaperId = value.TestPaperId; 
      UserId = value.UserId; 
      _id = value; 
     } 
    } 

    public string TestPaperId { get; protected set; } 

    public string UserId { get; protected set; } 

    protected TestPaperResult() { } 

    public TestPaperResult(TestPaperResultId id, 
          decimal fullmarks) 
    { 
     Id = id; 
     Fullmarks = fullmarks; 
    } 
} 
dbContext में

:

public Task<TestPaperResult> FindTestPaperResultAsync(TestPaperResultId id) 
{ 
    return GetByKeyAsync<TestPaperResult>(id.TestPaperId, id.UserId); 
}