2015-03-14 3 views
0

У меня есть 3 таблицы лица, адрес, personaddress человека имеет идентификатор, имя адреса идентификатор, адрес personaddress имеет PersonId, AddressID это многие ко многим все это работает отлично, если я пойдите в человека, чтобы искать по имени, удалять, обновлять, добавлять. чье-то с адресом. Однако то, что я хочу сделать, - это когда я ищу по имени, я хочу видеть, что он тянет не только имя, но и все адреса, с которыми это имя ассоциируется, и наоборот с адресом. Вот почему у меня есть таблица персонажа в качестве перекрестной ссылки. Так вот где я застрял, я не уверен, как сделать присоединение на select, потому что для этого требуется соединение на всех трех таблицах. то удаление требует от меня также удалить таблицу xref и основную таблицу. Любая помощь действительно ценится.множественное хранилище в одном контроллере

так я создал лицо, адрес, personaddress класса в Типовой папке люди

public class Person 
{ 
    public int Id {} 
    public string Name {} 
} 

адрес

public class Address 
{ 
    public int Id {} 
    public string Address{} 
} 

personaddress

public class PersonAddress 
{ 
    public int PersonId {} 
    public string AddressId {} 
} 

я также создал IPerson, iaddress, ipersonaddress класса в папке Model, Интерфейс IPerson

{ 
    IEnumerable<Person> GetAll(); 
    Person Get(int id); 
    Person Add(Person pers); 
    void Remove(int id); 
    bool Update(Person pers);   
} 

интерфейс IAddress

{ 
    IEnumerable<Address> GetAll(); 
    AddressGet(int id); 
    AddressAdd(Address addr); 
    void Remove(int id); 
    bool Update(Address addr);   
} 

интерфейс IPersonAddress

{ 
    IEnumerable<PersonAddress> GetAll(); 
    PersonAddressGet(int id); 
    PersonAddressAdd(PersonAddress persaddr); 
    void Remove(int id); 
    bool Update(PersonAddress persaddr);   
} 

тогда я создал personrepository, addressrepository, personaddressrepository в папке модели

public class PersonRepository : IPersonRepository 
{ 
    private List<Person> people= new List<Person>(); 
    private int _nextId = 1; 

    public PersonRepository() 
    { 
     Add(new Person{ Name = "Peter Smith" }); 
     Add(new Person{ Name = "Joe Doe" }); 
    } 

    public IEnumerable<Person> GetAll() 
    { 
     return people; 
    } 

    public PersonGet(int id) 
    { 
     return people.Find(p => p.Id == id); 
    } 

    public PersonAdd(Person pers) 
    { 
     if (pers== null) 
     { 
      throw new ArgumentNullException("pers"); 
     } 
     pers.Id = _nextId++; 
     people.Add(pers); 
     return pers; 
    } 

    public void Remove(int id) 
    { 
     people.RemoveAll(m => m.Id == id); 
    } 

    public bool Update(Person pers) 
    { 
     if (pers==null) 
     { 
      throw new ArgumentNullException("pers"); 
     } 
     int index = people.FindIndex(p => p.Id == pers.Id); 
     if (index ==-1) 
     { 
      return false; 
     } 
     people.RemoveAt(index); 
     people.Add(pers); 
     return true; 
    } 
} 

, затем я добавил контроллер для этих 3 человек, адрес, персональный адрес

public class PersonController : ApiController 
{   
    static readonly IPersonRepository repository = new PersonRepository(); 
    public IEnumerable<Person> GetPersonByName(string name) 
    { 
     return repository.GetAll().Where(p => p.Name.ToLower().Contains(name.ToLower())); 
    } 

    public HttpResponseMessage AddPerson(Person pers) 
    { 
     pers= repository.Add(pers); 
     var response = Request.CreateResponse<Person>(HttpStatusCode.Created, pers); 

     string uri = Url.Link("DefaultApi", new { id = pers.Id }); 
     response.Headers.Location = new Uri(uri); 
     return response; 
    } 

    public void UpdatePerson(int id, Person person) 
    { 
     person.Id = id; 
     if (!repository.Update(person)) 
     { 
      throw new HttpResponseException(HttpStatusCode.NotFound); 
     } 
    } 

    public void DeletePerson(int id) 
    { 
     Person pers= repository.Get(id); 
     if (pers== null) 
     { 
      throw new HttpResponseException(HttpStatusCode.NotFound); 
     } 
     repository.Remove(id); 
    } 
} 

ответ

0

У вас есть несколько возможностей. Вот два из них.

  1. Добавить public virtual ICollection<Address> Addresses{ get; set; } в вашей модели класса и инициализировать его внутри Constructor: Addresses = new Collection<Addresses>(); Это позволит отложенную загрузку вашей связанной коллекции ребенка. Сделайте то же самое для класса Address.

  2. Желательно загрузить их Include() в свои Get() и GetAll() методов.

    Пример: context.Persons.Include("Address").Where(x => x.PersonId == Id).ToList(); или форма нужного результата с Linq

Для удаления:

var person = context.Persons.GetById(personId); 

    foreach(var personAddress in person.Addresses) 
    { 
     person.Addresses.Remove(personAddress); 
     context.SaveChanges(); 
    } 

Или

var person = context.Persons.GetById(personId); 
    person.Addresses.Load(); 
    person.Addresses.ToList().ForEach(x => context.Addresses.DeleteObject(x)); 

Edit: Образец Person Класс

public class Person() 
{ 
    public Person() 
    { 
     Addresses = new Collection<Address>(); 
    } 

    public int Id {get; set;} 
    public string Name {get; set;} 
    public virtual Collection<Address> Addresses {get; set;} 
} 
+0

для шага 1 говорят, что он инициализирует его в интерфейсе? – user3731575

+0

Нет, в вашем классе «Человек». – vortex

+0

sorr Я новичок и пытаюсь узнать mvc и C#. Вероятно, lol должен был выбрать vb. поэтому она должна быть в [код] общественного класс Адрес { общественный ИНТ Id {} публичная строка адрес {} общественных виртуальный ICollection Людей {получить, набор;} общественных люди { Людей = новая коллекция (); } [/ code] – user3731575

Смежные вопросы