2015-06-03 4 views
0

Я пытаюсь создать общее репо и иметь некоторые проблемы. У меня есть следующий интерфейс:public RepoResult create (T item) {} Получить/прочитать значение PK элемента

public interface IGenRepo<T, TKey> where T : class 
{ 
    IQueryable<T> Items { get; } 
    T find(TKey pk); 
    RepoResult delete(TKey pk); 
    RepoResult create(T item); 
    RepoResult update(T item); 
    RepoResult save(); 
} 

А вот класс, который реализует этот интерфейс:

public class EFGenRepo<T, TKey> : IGenRepo<T, TKey> where T : class 
{ 
    private PortalEntities context = new PortalEntities(); 

    public IQueryable<T> Items { get { return context.Set<T>().AsQueryable<T>(); } } 

    public T find(TKey pk){} 

    public RepoResult delete(TKey pk){} 

    public RepoResult create(T item){ 
     if (item == null) return RepoResult.Failed(RepoMessages.paramIsNull()); 
     if (true) {//HELP HERE PLEASE, something like: if(item.PKHasNoValue == true) 
      context.Set<T>().Add(item); 
      return save(); 
     } else { 
      return RepoResult.Failed(RepoMessages.PKIsNotZeroAtCreate()); 
     } 
    } 
    public RepoResult update(T item){} 

    public RepoResult save(){ 
     try { 
      context.SaveChanges(); 
      return new RepoResult(); 
     } catch (Exception e){ 
      return RepoResult.Failed(RepoMessages.saveChangesFailure(e)); 
     } 
    } 

    private RepoResult save(T item){} 
} 

В моем создании метода я хочу, чтобы проверить значение PK элемента передается методу. Я знаю, что могу проверить это на своем контроллере, прежде чем вызывать код, но я хочу сделать это вот так! Таким образом, позволяет сказать, что я студент класса, как показано ниже:

public partial class student 
{  
    public int id { get; set; } 
    public string naam { get; set; } 
} 

И па студенческий объект с идентификатором 0, теперь я хочу, если заявление оценить, верно. Если у объекта-ученика уже есть идентификатор, он должен быть равен false. Но как я могу это проверить. Я полагаю, что мне нужно использовать что-то вроде кода ниже, но у меня нет навыков для этого:

typeof(TKey).Name; 
item.GetType().Name; 

Любая помощь очень ценится!

ответ

0

Решение, которое я сделал это создание интерфейса:

public interface IPKProvider 
{ 
    bool PKHasNoValue(); 
} 

Я позволяю все мои автоматически генерируемые классы EF (студент был просто пример) реализуют этот интерфейс (в отдельном файле частичного класса)

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

public partial class schakeling : IPKProvider 
{ 
    public bool PKHasNoValue() { 
     return this.id == 0; 
    } 
} 

Другой E F объект, позволяет сказать, пользователь будет выглядеть следующим образом:

public partial class user: IPKProvider 
{ 
    public bool PKHasNoValue() { 
     return string.IsNullOrEmpty(this.username); 
    } 
} 

Теперь я могу реализовать интерфейс IPKProvider в моем классе EFGenRepo так:

public class EFGenRepo<T, TKey> : IGenRepo<T, TKey> where T : class, IPKProvider 
{ 
    private PortalEntities context = new PortalEntities(); 

    public IQueryable<T> Items { get { return context.Set<T>().AsQueryable<T>(); } } 

    public T find(TKey pk){} 

    public RepoResult delete(TKey pk){} 

    public RepoResult create(T item){ 
     if (item == null) return RepoResult.Failed(RepoMessages.paramIsNull()); 
     if (item.PKHasNoValue()) {//<----------PROBLEM SOLVED 
      context.Set<T>().Add(item); 
      return save(); 
     } else { 
      return RepoResult.Failed(RepoMessages.PKIsNotZeroAtCreate()); 
     } 
    } 
    public RepoResult update(T item){} 

    public RepoResult save(){ 
     try { 
      context.SaveChanges(); 
      return new RepoResult(); 
     } catch (Exception e){ 
      return RepoResult.Failed(RepoMessages.saveChangesFailure(e)); 
     } 
    } 

    private RepoResult save(T item){} 
} 

Этот подход работает, но имеет некоторые минусы. Aldo не так много работы, я должен вручную создать дополнительный частичный класс для каждого автоматически созданного объекта EF. Я также обновляю их вручную, если структура базы данных изменится в будущем (чего, конечно, не происходит). Это работает, но мне это не нравится. Приветствуются любые комментарии.