2016-03-09 3 views
0

у меня есть несколько идентичных групп объектов, каждый из которых состоит из лиц, преобразованных в основную таблицу и пару ссылок таблиц, напримерEntity Framework - Общий метод для обработки идентичных объектов

//group1 
class OrderNote 
{ 
    public int OrderNoteId {get; set;} 
    public virtual ICollecton<OrderNoteTag> OrderNoteTags {get; set;} 
} 
class OrderNoteTag 
{ 
    public int OrderNoteId {get; set;} 
    public int TagId {get; set;} 
} 
////// 
//group 2 
class ClientNote 
{ 
    public int ClientNoteId {get; set;} 
    public virtual ICollecton<ClientNoteTag> ClientNoteTags {get; set;} 
} 
class ClientNoteTag 
{ 
    public int ClientNoteId {get; set;} 
    public int TagId {get; set;} 
} 
///// 

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

Вот что-то подобное должно быть:

public class TagBase 
{ 
    public int NoteId {get; set;} 
    public int TagId {get; set;} 
} 

public class NoteBase 
{ 
    public int NoteId {get; set;} 
    public virtual ICollecton<TagBase> NoteTags {get; set;} 
} 

//then we inherit 
public class OrderNoteTag : TagBase {} 

public class OrderNote : NoteBase 
{ 
    //Here we should pass the concrete type OrderNoteTag to NoteTags collection somehow 
} 

// Then we have method, where we should be able to pass OrderNote or ClientNote 
public void ProcessNote(NoteBase note) 
{ 
    foreach(var tag in note.NoteTags){...blah-blah-blah...} 
} 

Спасибо заранее.

+0

Вы попробуйте изменить подпись для ProcessNote на 'общественного недействительными ProcessNote (TNote примечание), где TNote: NoteBase'? –

+0

@raderick, мне нужен общий алгоритм для сохранения заметок, не зависящих от их типа. Они должны прийти на сервер в форме базового класса. И, опять же, главная проблема - наследовать свойства навигации с правильным типом, и это не решает проблему. – KorsaR

+0

Я не совсем уверен, что вы пытаетесь сделать здесь, вероятно, вы также должны взглянуть на шаблон посетителя. –

ответ

1

Рассмотрите этот подход, он основан на интерфейсах. Теперь вы можете использовать тип INote<INoteTag> вместо NoteBase, посмотрите на конец моего ответа, но вместо NoteTags свойство внутри цикла foreach вы должны использовать метод NoteTagsCustom(), я надеюсь, что это не важно для вас.

МОДЕЛИ:

public interface INote<out T> where T : INoteTag 
{ 
    int NoteId { get; set; }   
    IEnumerable<T> NoteTagsCustom(); 
} 

public interface INoteTag 
{ 
    int NoteTagId { get; set; } 
    int TagId { get; set; } 
} 

public class OrderNote : INote<OrderNoteTag> 
{ 
    [Key] 
    public int NoteId { get; set; } 
    public virtual ICollection<OrderNoteTag> NoteTags { get; set; } 

    public IEnumerable<OrderNoteTag> NoteTagsCustom() 
    { 
     return NoteTags; 
    } 
} 
public class OrderNoteTag : INoteTag 
{ 
    [Key] 
    public int NoteTagId { get; set; } 
    [ForeignKey("OrderNote")] 
    public int TagId { get; set; } 
    public virtual OrderNote OrderNote { get; set; } 
} 

public class ClientNote : INote<ClientNoteTag> 
{ 
    [Key] 
    public int NoteId { get; set; } 
    public virtual ICollection<ClientNoteTag> NoteTags { get; set; } 

    public IEnumerable<ClientNoteTag> NoteTagsCustom() 
    { 
     return NoteTags; 
    } 
} 
public class ClientNoteTag : INoteTag 
{ 
    [Key] 
    public int NoteTagId { get; set; } 
    [ForeignKey("ClientNote")] 
    public int TagId { get; set; } 
    public virtual ClientNote ClientNote { get; set; } 
} 

РЕАЛИЗАЦИЯ:

//important: INote<INoteTag> instead of NoteBase! 
public void ProcessNote(INote<INoteTag> note) 
{ 
    //important: NoteTagsCustom() instead of NoteTags! 
    foreach(var tag in note.NoteTagsCustom()){...blah-blah-blah...} 
} 
+0

Спасибо, это именно то, что я искал. Я как-то заставлял его работать с использованием базового базового класса, но этот подход кажется лучше. – KorsaR

+0

Совсем нет. Ваш подход с наследованием классов является хорошим и наиболее очевидным шаблоном, но в случае EF он не очень подходит, потому что мы должны следовать определенным правилам и соглашениям EF, связанным с созданием таблиц, отношениями между ними и другими функциями, и все это ограничьте нас диапазоном применимых шаблонов. –