2017-02-24 148 views
3

我使用DB第一種方法實體框架和繼承

我有3個「訂單」列(客戶端記錄的順序)表。我想創建類似的邏輯來在我的.NET應用程序中重新排序,所以我想使用基類。我創建了以下結構:

enter image description here

,但項目無法編譯,列的順序不被映射爲每3個表,我沒有看到一個方法來映射它:

enter image description here

如何說,Order列應該映射到父類的屬性Order?

更新:

否則我要創建像類似的方法:

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

我想有一個方法,並傳遞基類的對象作爲參數

+0

我覺得繼承不是這裏的正確方法。如果在此上下文中Order的含義是序列的順序,我認爲每個實體都應該有它自己的Order屬性。 –

+0

我不想公開重新排序邏輯。我想有一個方法來重新排序和傳遞基類而不是具體的類 –

+0

你做它很複雜,雖然它可能很簡單,我想這是可能的,但我甚至不建議你這樣做,因爲實體框架有時無法解析像這樣的邏輯。 –

回答

1

如果我理解你好,沒有OrderBase的表格。這意味着這是一個每個具體類型(TPC)映射。 This link表明,在代碼優先的情況下,映射TPC並不困難。

但是,數據庫優先和TPC並不能很好地結合在一起。您必須編輯EDMX才能完成此操作。

我是用你的兩個類來完成的。目前,在您的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缺失。但是,您可以手動添加它們,EF會很樂意和EDMX仍然可以在設計中打開:

<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> 

無論其:當你更新從數據庫模型,修改將會消失。每次你這樣做,你都必須重新添加它們。如果可以,我強烈建議您將代碼移植到代碼優先。

+0

我需要DB優先實現 –

+0

然後這是您唯一的選擇。我希望你很清楚,這仍然是數據庫第一,但需要一點幫助。 –