Могу ли я использовать и вернуть объекты POCO с кодом EF4 в качестве их интерфейса? - PullRequest
3 голосов
/ 22 января 2011

Учитывая код, приведенный ниже в этом вопросе, я получаю следующую ошибку от EF4 API, использующего код сначала:

Данное свойство "Роли" не является поддерживается свойство навигации. Тип элемента свойства 'IRole' не поддерживаемый тип объекта. Типы интерфейса не поддерживаются.

По сути, у меня есть хранилище, похожее на следующее:

public class Repository : IRepository {
    private IEntityProvider _provider;
    public Repository(IEntityProvider provider) {
        _provider = provider;
    }
    public IUser GetUser(int id) {
        return _provider.FindUser(id);
    }
}

Обратите внимание, что IRepository.GetUser возвращает IUser.

Допустим, моя реализация IEntityProvider выглядит следующим образом.

public class EntityProvider : IEntityProvider {
    public IUser FindUser(int id) {
        /* Using Entity Framework */
        IUser entity;
        using (var ctx = new MyDbContext()) {
            entity = (from n in ctx.Users 
                  where n.Id == id 
                  select (IUser)n).FirstOrDefault();
        }
        return entity;
    }
}

Ключевым моментом здесь является то, что интерфейс IUser имеет свойство List с именем Roles. По-видимому, из-за этого Entity Framework сначала не может выяснить, какой класс использовать для выполнения интерфейса IRole, в котором нуждается это свойство.

Ниже приведены интерфейсы и объекты POCO, которые будут использоваться во всей системе и, будем надеяться, также использоваться с EF4.

public interface IUser {
    int Id { get; set; }
    string Name { get; set; }
    List<IRole> Roles { get; set; }
}

public interface IRole {
    int Id { get; set; }
    string Name { get; set; }
}

public class User : IUser {
    public int Id { get; set; }
    public string Name { get; set; }
    public List<IRole> Roles { get; set; }
}

public class Role : IRole {
    public int Id { get; set; }
    public string Name { get; set; }
}

Я поступаю неправильно? Есть ли способ сделать это в API-интерфейсе EF4-код?

Я могу думать только о следующем:

  1. Какой-то тип тени (List DbRoles), который используется EF4-кодом в первую очередь. Затем используйте аннотации данных, чтобы убедиться, что фактический список игнорируется EF4.
  2. Создайте дублирующиеся классы для всех сущностей, которые сначала будет использовать код EF4, а затем сопоставьте их с официальными, реализующими интерфейс.

Ответы [ 2 ]

2 голосов
/ 05 мая 2011

Помните, вам нужно сделать базовые классы абстрактными (для этого проверьте наследование с документами EF), Я рекомендую иметь RootEntity, в котором ничего нет, а затем сущность Base с некоторой общей информацией, такой как Id, InsertedBy, UpdatedBy, как стандартные поля, это делает все намного проще.

1 голос
/ 23 января 2011

Использование интерфейсов не поддерживается в EF 4 Code First (начиная с CTP5) и, скорее всего, не будет поддерживаться в RTM.Я бы сказал, создайте абстрактный класс в вашем DbContext для хранения ваших объектов.

...