Entity Framework 4.1 Слабая связь с сущностями - PullRequest
0 голосов
/ 08 декабря 2011

Нужна небольшая помощь, если кто-нибудь может пролить свет на это.

Я создал приложение MVC 3 с первым кодом, которое у меня работает нормально. Сейчас я занимаюсь рефакторингом, чтобы удалить как можно больше связей, так как я хочу, чтобы модель домена использовалась позже в других приложениях MVC 3. Теперь у меня есть набор сущностей, которые сохраняются через нормализованную базу данных, и они CRUD-редактируются через шаблон репозитория. Я использовал Ninject для DI репозиториев через конструктор контроллера и использую модели в проекте MVC 3 для работы в качестве DAO.

Итак, в домене у меня есть объект с именем Дело , у которого есть внешний ключ к другому делу Клиент , который выглядит следующим образом:

public class Case : ICase
{
    [Key]
    public int CaseId { get; set; }
    public string CaseName { get; set; }
    public DateTime DateCreated { get; set; }
    public IClient Client { get; set; }
}

Тогда у меня есть интерфейс (интерфейс существует, главным образом, для его реализации в модели представления, чтобы добавить свои аннотации данных - я знаю, что мог бы добавить аннотации к объекту домена, но, как я уже сказал, я хочу использовать эту модель домена в других приложения, которые будут иметь другой вездесущий язык.

public interface ICase
{
    int CaseId { get; set; }
    string CaseName { get; set; }
    DateTime DateCreated { get; set; }
    IClient Client { get; set; }
}

И тогда у меня есть модель представления в проекте MVC 3.

public class CaseModel : ICase
{
    [HiddenInput(DisplayValue = false)]
    int CaseId { get; set; }

    [Required(AllowEmptyStrings = false)]
    [MaxLength(100)]
    string CaseName { get; set; }

    [RegularExpression("")]
    DateTime DateCreated { get; set; }    

    IClient Client { get; set; }    
}

Итак, моя первая проблема заключается в следующем: изменение ссылки на внешний ключ для Client на IClient - это новая вещь, которая возвращает нулевой объект. Когда тип был конкретным классом, он возвращался нормально - я предполагаю, что это потому, что EF4.1 пытается создать экземпляр IClient . Я здесь совершенно не прав или есть способ обойти это?

Моя вторая проблема (которая может свести на нет мою первую проблему) заключается в том, что я также делаю что-то не так, добавляя аннотации данных в модель представления, наследующую интерфейс моей сущности домена? Должен ли я использовать метаданные модели? Если да, то как я могу использовать метаданные таким образом, чтобы я мог сделать аннотации данных уникальными для каждого проекта, не затрагивая домен?

Спасибо!

1 Ответ

3 голосов
/ 08 декабря 2011

Предупреждение: я не эксперт по EF или MVC3.

Мы находимся в процессе создания сущностей EF Code First, и мы не планируем добавлять интерфейсы к сущностям.Репозитории получают интерфейсы.Единицы работы получают интерфейсы.Сущности нет.Хранилища возвращают конкретные объекты, которые являются POCO.Объекты могут быть связаны со связанными объектами.Модели и другие классы обычно получают интерфейсы репозитория и / или интерфейсы рабочих единиц. Для тестирования мы просто добавим некоторые объекты POCO и вернем их из репозиториев.

Мы планируемсделайте соответствующие свойства POCO виртуальными, чтобы EF мог создавать прокси.

Если вы хотите отделить представление от конкретных объектов, я бы сначала спросил, какое значение вы ожидаете получить от этого.Будет ли представление повторно использоваться с разными объектами?Если это так, один из вариантов будет использовать что-то вроде AutoMapper для копирования свойств.Вы должны знать о немедленном доступе к свойствам отложенной загрузки.

...