一个控制器中的多个存储库

multiple repository in one controller

我有 3 个 table 人,地址,人地址 person 有 id, name address 有 id, address personaddress 有 personid, addressid 这是多对多 如果我亲自去按名称搜索、删除、更新、添加,所有这些都可以正常工作。与地址相同。但是,我想做的是,当我按名称搜索时,我希望看到它不仅提取名称,还提取与该名称关联的所有地址,反之亦然。这就是为什么我将 personaddress table 作为交叉引用。所以这就是我卡住的地方,我不确定如何在 select 上进行连接,因为它需要在所有 3 个 table 上进行连接。然后删除要求我删除外部参照 table 和主要 table。非常感谢任何帮助。

所以我在模型文件夹中创建了人、地址、人地址 class 人

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

地址

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

个人地址

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

我还在模型文件夹中创建了 iperson、iaddress、ipersonaddress class, 界面 IPerson

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

接口地址

{
    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);
    }
}

你有几种可能性。这是其中的两个。

  1. public virtual ICollection<Address> Addresses{ get; set; } 添加到您的模型 class 并在 Constructor 中初始化它: Addresses = new Collection<Addresses>(); 这将启用相关子集合的延迟加载.对 Address class.

    做同样的事情
  2. 渴望在您的 Get()GetAll() 方法中使用 Include() 加载它们。

    示例: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));

编辑:样本人物 Class

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;}
}