7

Я использую Entity Framework 5 в базе данных Первый подход, и я использую edmx-файл.Базовый класс/Entity в EntityFramework 5.0

Большинство моих объектов имеют 6 общих полей. Такие поля, как CreatedAt, CreatedBy и т. Д. Теперь я реализовал некоторые функции в качестве расширений, которые могут применяться только к IQueryable тех объектов, которые имеют общие поля. Но когда я реализую метод расширения, к нему можно получить доступ любым типом IQueryable, поскольку он набрал T, и я могу только определить, что тип T всегда должен быть одного типа.

Итак, я думал, что могу дать базовый класс сущностям, которые имеют общие поля и определить тип T в качестве базового типа. Но, похоже, я не могу этого сделать.

Любая идея о том, как решить эту проблему или реализовать то, что я объяснил выше?

ответ

8

Не создавайте базовый класс. Создание интерфейса, как показано ниже:

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

Тогда ваши модели будет выглядеть следующим образом:

[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

Спасибо за быстрый ответ. Итак, если я определяю интерфейс вне файла edmx. то где я собираюсь сказать сущности реализовать из этого интерфейса. Нелегко вручную отредактировать все необходимые сущности, поскольку мне придется делать это снова, когда я обновляю файл edmx. – Amila

+2

Вы не трогаете автоматически сгенерированный код. Для этого должны использоваться частичные классы. Вы создаете частичный класс (в папке «Модели») для каждого из ваших объектов в EF. Здесь вы можете определить MetadataType для своих моделей (для аннотации данных). См. Обновленный ответ. – ataravati

+0

Да, я использую MetadataType на данный момент. Но подумал, что может быть простой способ сделать это, например, дать базовый класс сущности, было бы лучше, если бы это позволило также дать интерфейс на диаграмме. Как бы то ни было, это похоже на то, что мне придется определить частичный класс для всех объектов. Спасибо за вашу быструю помощь – Amila

2

Я поклонник:

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

Тогда, ваши модели будут например:

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

Если T4 genera Ted по Entity Framework, то ваш , не автоматически генерируемый класс будет выглядеть следующим образом:

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

Как правило, it is not recommended to use Bind in Asp.Net MVC.