一个控制器中的多个存储库
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);
}
}
你有几种可能性。这是其中的两个。
将 public virtual ICollection<Address> Addresses{ get; set; }
添加到您的模型 class 并在 Constructor
中初始化它: Addresses = new Collection<Addresses>();
这将启用相关子集合的延迟加载.对 Address
class.
做同样的事情
渴望在您的 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;}
}
我有 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);
}
}
你有几种可能性。这是其中的两个。
将
做同样的事情public virtual ICollection<Address> Addresses{ get; set; }
添加到您的模型 class 并在Constructor
中初始化它:Addresses = new Collection<Addresses>();
这将启用相关子集合的延迟加载.对Address
class.渴望在您的
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;}
}