2015-06-18 18 views
5

Mam aplikację n-warstwową, która ma wiele warstw w różnych złożeniach. używam struktury encji 6.1 i chcę dodać własność ObjectState do jednostki podstawowej do śledzenia stanów encji. Problem polega na tym, że BaseEntity znajduje się w mojej bibliotece obiektów domenowych, która jest niezależna od bazy danych i chcę dodać ObjectState w projekcie Entity Framework, ponieważ ta właściwość jest powiązana z encją obiektu. Jak osiągnąć to zachowanie?C# Jak rozszerzyć klasę istniejącą w innej bibliotece dll, dodając do niej właściwość?

public enum ObjectState 
{ 
    Unchanged, 
    Added, 
    Modified, 
    Deleted 
} 
public interface IObjectState 
{ 
    [NotMapped] 
    ObjectState ObjectState { get; set; } 
} 
+0

Jeśli zajęcia są publiczne i nie są zapieczętowane, jaki jest problem z dziedziczeniem? Chyba coś tu brakuje. –

+0

Czy problemem jest atrybut "NotMapped'? Czy możesz użyć płynnej konfiguracji EF, aby upewnić się, że właściwość nie jest odwzorowana w zamian? –

+0

Witam, nie chcę dodawać właściwości ObjectState do mojej jednostki bazowej, ponieważ jest to podstawa mojej domeny, a ta właściwość jest specyficzna dla Entity Framework – yo2011

Odpowiedz

0

Jeśli masz na myśli, że nie można realizować IObjectState w BaseEntity, ponieważ musi on być niezależny od EF specyficzny, wtedy powinieneś mieć dwa zestawy jednostek - jeden dla domeny, po jednym dla EF i użyć mapowania (ewentualnie Automapper) pomiędzy tymi zestawami:

// domain entities assembly 
public abstract class BaseEntity { } 

// EF entities assembly 
public abstract class BaseEFEntity : IObjectState 

// somewhere in the code 
Mapper.Map(domainEntity, efEntity); 

Faktycznie, podczas korzystania warstwową architekturę, jest to korzystne sposób, gdy każda warstwa prowadzi do jego konkretnych modeli.

+0

Dziękuję za pomoc, ale spowoduje to dodanie kolejnej warstwy, ponieważ mam już warstwę DTO i więc doda złożoność aplikacji – yo2011

2

Możesz użyć partial classes, jeśli możesz edytować kod projektów domen i zadeklarować jednostkę podstawową jako klasę częściową.

namespace DomainNameSpace 
{ 
    public partial class BaseEntity 
    { 
     // Your properties and method 
    } 
} 

Następnie w projekcie Entity Framework można dodać następujący kod:

namespace DomainNameSpace 
{ 
    public partial class BaseEntity 
    { 
     public enum ObjectState 
     { 
      Unchanged, 
      Added, 
      Modified, 
      Deleted 
     } 
     public interface IObjectState 
     { 
      [NotMapped] 
      ObjectState ObjectState { get; set; } 
     } 
    } 
} 

Albo jeśli nie można edytować pliki w projekcie domeny lub nie lubią tej metody, może dziedziczenie możliwe, Wsparcie. W projekcie Entity Framework utwórz klasę podobną do poniższej.

namespace YourProjectNameSpace 
{ 
    public class StatefulEntityClassName : BaseEntity 
    { 
     public enum ObjectState 
     { 
      Unchanged, 
      Added, 
      Modified, 
      Deleted 
     } 
     public interface IObjectState 
     { 
      [NotMapped] 
      ObjectState ObjectState { get; set; } 
     } 
    } 
} 

Mam nadzieję, że ta pomoc.

+0

Dzięki, ale częściowe klasy muszą być w tym samym projekcie (dll) – yo2011