7

Używam Entity Framework 5 w Database First i używam pliku edmx.Klasa podstawowa/encja w EntityFramework 5.0

Większość moich jednostek ma 6 wspólnych pól. Pola takie jak CreatedAt, itd. Teraz zaimplementowałem niektóre funkcje jako rozszerzenia, które można zastosować tylko do IQueryable tych jednostek, które mają wspólne pola. Ale kiedy implementuję metodę rozszerzenia, można uzyskać do niego dostęp za pomocą dowolnego typu IQueryable, ponieważ jest wpisane T i mogę tylko zdefiniować, że typ T powinien zawsze być jednego typu.

Pomyślałem więc, że mogę podać klasę podstawową dla elementów, które mają wspólne pola i zdefiniować typ T jako ten typ bazowy. Ale wydaje się, że nie mogę tego zrobić.

Każdy pomysł, jak rozwiązać ten problem lub zastosować to, co wyjaśniłem powyżej?

Odpowiedz

8

Nie twórz klasy bazowej. Tworzenie interfejsu, jak poniżej:

public interface IMyEntity 
{ 
    DateTime CreatedAt { get; set; } 
    string CreatedBy { get; set; } 
    // Other properties shared by your entities... 
} 

Następnie modeli będzie tak:

[MetadataType(typeof(MyModelMetadata))] 
public partial class MyModel : IMyEntity 
{ 
    [Bind()] 
    public class MyModelMetadata 
    { 
     [Required] 
     public object MyProperty { get; set; } 

     [Required] 
     public string CreatedBy { get; set; } 
    } 
} 
+0

Dzięki za szybką odpowiedź. Tak więc, jeśli zdefiniuję interfejs poza plikiem edmx. to gdzie mam powiedzieć podmiotowi, żeby zaimplementował z tego interfejsu. Nie jest łatwo ręcznie edytować wszystkie wymagane jednostki, ponieważ będę musiał to zrobić ponownie, gdy zaktualizuję plik edmx. – Amila

+2

Nie dotykaj automatycznie wygenerowanego kodu. Do tego mają służyć częściowe klasy. Tworzysz klasę częściową (w folderze Modele) dla każdej jednostki w EF. Tam możesz zdefiniować MetadataType dla swoich modeli (dla adnotacji danych). Zobacz zaktualizowaną odpowiedź. – ataravati

+0

Tak, używam w tej chwili MetadataType. Ale myślę, że może być łatwy sposób robienia tego, np. Jak nadanie klasy bazowej jednostce, byłoby lepiej, gdyby pozwolił dać interfejs również na schemacie. W każdym razie, to tak, jakbym musiał zdefiniować klasę cząstkową dla wszystkich bytów. Dziękuję za szybką pomoc. – Amila

2

jestem fanem:

public interface IShared 
{ 
    DateTime CreatedOn { get; set; } 
} 

public interface ISharedValidation 
{ 
    [Required] 
    DateTime CreatedOn { get; set; } 
} 


public interface IMyEntity: IShared 
{ 
    // Entity Specifics 
    string Username { get; set; } 
} 

public interface IMyEntityValidation: ISharedValidation 
{ 
    [Required] 
    string Username { get; set; } 
} 

Następnie, Twoje modele będą tak:

[MetadataType(typeof(IMyEntityValidation))] 
public partial class MyModel : IMyEntity 
{ 
    public object CreatedOn { get; set; } 
    public string Username { get; set; } 
} 

Jeśli T4 genera ted przez Entity Framework wówczas non-wygenerowany automatycznie klasa będzie wyglądać następująco:

[MetadataType(typeof(IMyEntityValidation))] 
public partial class MyModel : IMyEntity 
{ 
} 

Zazwyczaj it is not recommended to use Bind in Asp.Net MVC.