sql - इकाई फ़्रेमवर्क और विरासत




entity-framework inheritance entity-framework-6 (2)

अगर मैं आपको अच्छी तरह समझता हूं, तो OrderBase लिए कोई तालिका नहीं है इसका मतलब यह है कि यह एक तालिका प्रति कंक्रीट-प्रकार (टीपीसी) मैपिंग है। इस लिंक से पता चलता है कि पहले कोड के साथ, टीपीसी मानचित्रण करना मुश्किल नहीं है

डाटाबेस-पहले और टीपीसी, हालांकि, अच्छा एक साथ नहीं खेलते हैं। आपको यह करने के लिए EDMX को संपादित करना होगा।

मैंने अपनी दो कक्षाओं के साथ किया। वर्तमान में, आपके एडीएमएक्स के CS मैपिंग सामग्री अनुभाग में आपको ऐसा कुछ मिलेगा:

  <EntitySetMapping Name="OrderBases">
    <EntityTypeMapping TypeName="IsTypeOf(TPCModel.EcortGroup)">
      <MappingFragment StoreEntitySet="EcortGroup">
        <ScalarProperty Name="GroupName" ColumnName="GroupName" />
        <ScalarProperty Name="ID" ColumnName="ID" />
      </MappingFragment>
    </EntityTypeMapping>
    <EntityTypeMapping TypeName="IsTypeOf(TPCModel.EscortItem)">
      <MappingFragment StoreEntitySet="EscortItem">
        <ScalarProperty Name="Escort" ColumnName="Escort" />
        <ScalarProperty Name="EcortGroup_ID" ColumnName="EcortGroup_ID" />
        <ScalarProperty Name="ID" ColumnName="ID" />
      </MappingFragment>
    </EntityTypeMapping>
  </EntitySetMapping>

यह बताता है कि कौन से कॉलम मैप किए जाते हैं जो कि गुण जैसा कि आप देख रहे हैं, Order गायब है। लेकिन आप मैन्युअल रूप से उन्हें जोड़ सकते हैं, और ईएफ खुश रहेंगे और ईडीएमएक्स अब भी डिजाइनर में खोला जा सकता है:

    <EntityTypeMapping TypeName="IsTypeOf(TPCModel.EcortGroup)">
      <MappingFragment StoreEntitySet="EcortGroup">
        <ScalarProperty Name="GroupName" ColumnName="GroupName" />
        <ScalarProperty Name="ID" ColumnName="ID" />
        <ScalarProperty Name="Order" ColumnName="Order" />
      </MappingFragment>
    </EntityTypeMapping>
    <EntityTypeMapping TypeName="IsTypeOf(TPCModel.EscortItem)">
      <MappingFragment StoreEntitySet="EscortItem">
        <ScalarProperty Name="Escort" ColumnName="Escort" />
        <ScalarProperty Name="EcortGroup_ID" ColumnName="EcortGroup_ID" />
        <ScalarProperty Name="ID" ColumnName="ID" />
        <ScalarProperty Name="Order" ColumnName="Order" />
      </MappingFragment>
    </EntityTypeMapping>

फिर भी : जब आप डेटाबेस से मॉडल को अपडेट करते हैं, तो संशोधनों को समाप्त हो जाएगा हर बार जब आप ऐसा करते हैं तो आपको उन्हें फिर से जोड़ना होगा। यदि आप कर सकते हैं, तो मैं दृढ़ता से आपको कोड को कोड के लिए पोर्ट करने की सलाह देता हूं- पहले

मैं डीबी पहले दृष्टिकोण का उपयोग करता हूं

मेरे पास "ऑर्डर" कॉलम (रिकॉर्ड के क्लाइंट ऑर्डर) के साथ 3 तालिकाओं हैं मैं अपने। NET अनुप्रयोग में पुनर्क्रमित करने के लिए समान तर्क बनाना चाहता हूं, इसलिए, मैं बेस क्लास के साथ काम करना चाहता हूं। मैंने निम्न संरचना बनाई है:

लेकिन प्रोजेक्ट को संकलित नहीं किया जा सकता है, प्रत्येक 3 तालिकाओं के लिए कॉलम ऑर्डर को मैप नहीं किया गया है और मुझे इसे मैप करने का कोई तरीका नहीं दिखाई देता है:

कहने के लिए, ऑर्डर कॉलम को मैपिक क्लास के प्रॉपर्टी ऑर्डर के अनुसार मैप किया जाना चाहिए?

अपडेट:

अन्यथा मुझे समान तरीके से बनाना होगा जैसे:

public interface IOrder
{
    int Order { get; set; }
}

public partial class EscortDescription : IOrder
{
}

public partial class EscortGroup : IOrder
{

}

public partial class EscortItem : IOrder
{

}

    private async Task ReorderEscortAsync(Infrastructure.IOrder item1, Infrastructure.IOrder item2)
    {
        Random rnd = new Random();
        if (item1 == null)
            throw new ArgumentNullException("firstItem");

        if (item2 == null)
            throw new ArgumentNullException("secondItem");

        int tmpItem1Order = item1.Order;
        int tmpItem2Order = item2.Order;
        item1.Order = rnd.Next(int.MinValue, -1);
        item2.Order = rnd.Next(int.MinValue, -1);
        _db.SaveChanges();

        item1.Order = tmpItem2Order;
        item2.Order = tmpItem1Order;
        await _db.SaveChangesAsync();
    }

    public async Task EscortGroupItemUpAsync(int ItemID)
    {
        var firstItem = (from i in _db.EscortItems where i.ID == ItemID select i).FirstOrDefault();
        if (firstItem == null)
            throw new Domain.RecordNotFoundException<int>(ItemID, "ID", "EscortItems");
        var secondItem = (from i in _db.EscortItems where i.Order < firstItem.Order orderby i.Order descending select i).FirstOrDefault();

        if (secondItem != null)
            await ReorderEscortAsync(firstItem, secondItem);
        else
            throw new FirstRecordException();
    }

    public async Task EscortGroupItemDownAsync(int ItemID)
    {
        var secondItem = (from i in _db.EscortItems where i.ID == ItemID select i).FirstOrDefault();
        if (secondItem == null)
            throw new Domain.RecordNotFoundException<int>(ItemID, "ID", "EscortItems");
        var firstItem = (from i in _db.EscortItems where i.Order > secondItem.Order orderby i.Order ascending select i).FirstOrDefault();

        if (firstItem != null)
            await ReorderEscortAsync(firstItem, secondItem);
        else
            throw new LastRecordException();
    }

    public async Task EscortGroupUpAsync(int ItemID)
    {
        var firstItem = (from i in _db.EscortGroups where i.ID == ItemID select i).FirstOrDefault();
        if (firstItem == null)
            throw new Domain.RecordNotFoundException<int>(ItemID, "ID", "EscortGroups");
        var secondItem = (from i in _db.EscortGroups where i.Order < firstItem.Order orderby i.Order descending select i).FirstOrDefault();

        if (secondItem != null)
            await ReorderEscortAsync(firstItem, secondItem);
        else
            throw new FirstRecordException();
    }

    public async Task EscortGroupDownAsync(int ItemID)
    {
        var secondItem = (from i in _db.EscortGroups where i.ID == ItemID select i).FirstOrDefault();
        if (secondItem == null)
            throw new Domain.RecordNotFoundException<int>(ItemID, "ID", "EscortGroups");
        var firstItem = (from i in _db.EscortGroups where i.Order > secondItem.Order orderby i.Order ascending select i).FirstOrDefault();

        if (firstItem != null)
            await ReorderEscortAsync(firstItem, secondItem);
        else
            throw new LastRecordException();
    }

मुझे पैरामीटर के रूप में एक विधि और आधार वर्ग की ऑब्जेक्ट पास करना होगा


परियोजना से इकाई फ्रेमवर्क को nuget के माध्यम से हटा दें और फिर इसे वापस जोड़ें।





sql entity-framework inheritance entity-framework-6