Вы писали:
Ситуация, в которой я на данный момент храню один адрес, сохраняется в таблице Person, а рабочие и другие адреса хранятся в другом.
Итак, у вас есть класс Person, у которого есть контактный адрес, а также набор из нуля или более альтернативных адресов.Это может быть отношение «один ко многим» или отношение «многие ко многим», для класса Person это на самом деле не имеет значения:
class Person
{
public int Id {get; set;}
public Address MainAddress {get; set;}
... // other properties
// every Person has zero or more Alternative Addresses:
public virtual ICollection<AlternativeAddress> AlternativeAddresses {get; set;}
}
class AlternativeAddress
{
public int Id {get; set;}
public Address Address {get; set;}
... // other properties
// if this Address belongs to exactly one Person (one-to-many)
public int PersonId {get; set;}
public virtual Person Person {get; set;}
// or if this address may be the address of several Persons (many-to-many)
public virtual ICollection<Person> Persons {get; set;}
}
В каркасе сущностей столбцы таблицыпредставлены не виртуальными свойствами.Виртуальные свойства представляют отношения между таблицами (один ко многим, многие ко многим, ...)
Адрес - это класс.Поскольку я не объявил MainAddress виртуальным, свойства Address будут столбцами внутри Person.Аналогично, свойства адреса в AlternativeAddress
будут столбцами внутри альтернативного адреса.
Если вы не использовали адрес класса, чтобы убедиться, что ваш главный адрес имеет точно такую же структуру, что и альтернативные адреса,должен сделать выбор.
Это все, что должна знать структура сущностей, чтобы обнаружить ваши таблицы и отношения между таблицами, первичным и внешним ключами.Только если вам нужны разные идентификаторы, вам нужны атрибуты или свободный API.
Требование Учитывая входной параметр personId, дайте мне (некоторые свойства) Person со всеми его адресами.
var result = dbContext.Persons
.Where(person => person.Id == personId)
.Select(person => new
{
// select only the properties you plan to use:
Id = person.Id,
FirstName = person.FirstName,
...
// For the contact Addresses, concat the MainAddress and the Alternative Addresses
ContactAddresses = new Address[] {person.MainAddress}
.Concat(person.AlternativeAddresses.Select(address => address.Address)
// use a Select if you don't need all Address properties:
.Select(address => new
{
Street = address.Street,
City = address.City,
PostCode = address.PostCode,
...
});
Если классы Person и AlternativeAddress не имеют свойств адреса, вам нужно выбрать нужные свойства:
ContactAddresses =
// Main Address
new []
{
Street = person.Street,
City = person.City,
PostCode = person.PostCode,
...
}
.Concat(person.AlternativeAddresses.Select(address => new
{
Street = address.Street,
City = address.City,
PostCode = address.PostCode,
...
}),