Разница между двумя подходами внешнего ключа в коде первого Entity Framework - PullRequest
0 голосов
/ 23 июня 2018

Я новичок в asp.net MVC и базе данных.Я обнаружил, что существует два способа создания отношения внешнего ключа.

Подход № 1:

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual List<Vehicle> vehicles { get; set; }
}

public class Vehicle
{
    public int Id { get; set; }
    public string lic_number { get; set; }
}

и второй способ:

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class Vehicle
{
    public int Id { get; set; }
    public string lic_number { get; set; }
    public virtual Person person { get; set; }
}

Пожалуйста, скажите мнеесть ли разница в двух подходах.

Спасибо, что прочитали мой вопрос.

Ответы [ 3 ]

0 голосов
/ 24 июня 2018

Результат подходов будет одинаковым - создание отношения один-ко-многим.

Однако вы можете написать классы вашего домена следующим образом - имея удобный доступ к связанным свойствам как издва объекта.

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Vehicle> Vehicles { get; set; }
}

public class Vehicle
{
    public int Id { get; set; }
    public string lic_number { get; set; }

    public virtual Person Person { get; set; }
    public int PersonId { get; set; }
}

Это автоматически сгенерирует отношения на основе кода.Если вы хотите быть откровенным при разработке, вы можете использовать подход Fluent Api. Проверьте здесь

0 голосов
/ 02 июля 2018

Вы хотите, чтобы каждый Person имел ноль или более Vehicles, а каждый Vehicle принадлежит ровно одному Person.

Чтобы выразить это более четко, я бы использовал оба объявления. Это будет легче для будущих читателей вашего кода. Кроме того, ваши запросы не нуждаются в объединении.

class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    // every Person has zero or more Vehicles:
    public virtual ICollection<Vehicle> Vehicles { get; set; }
}

class Vehicle
{
    public int Id { get; set; }
    public string LicenseNumber { get; set; }

    // every vehicle belongs to exactly one Person using foreign key
    public int PersonId {get; set;}
    public virtual Person Person {get; set;}
}

Возможно, Владелец будет лучшим именем для Владельца этого Транспортного средства.

Обратите внимание, что я объявил все столбцы таблиц. Отношения между таблицами объявлены виртуальными: они не являются реальной частью таблицы.

Я изменил List<Vehicle> на ICollection<Vehicle>. В конце концов, будет Vehicle[4] иметь определенное значение?

Кроме того, ваши отношения между таблицами будут более понятными для читателя, ваши запросы будут проще:

«Дайте мне идентификатор и имена всех лиц, имеющих два или более транспортных средств»

var result = myDbcontext.Persons
    .Where(person => person.Vehicles.Count >= 2)
    .Select(person => new
    {
         Id = person.Id,
         Name = person.Name,
    })

«Дайте мне имена и фамилии всех лиц с их транспортными средствами старше ...»

var result = myDbContext.Persons.Select(person => new
{
    Id = person.Id,
    Name = person.Name,
    OldVehicles = person.Vehicles
        .Where(vehicles => vehicle.CreationDate < OldDate)
        .ToList(),
});

"Дайте мне все старые транспортные средства вместе с идентификатором и именем их владельца"

var result = myDbContext.Vehicles
    .Where(vehicle => vehicle.CreationDate < OldDate)
    .Select(vehicle => new
    {
        LicenseNumber = vehicle.LicenseNumber,
        Owner = new
        {
             Id = vehicle.Person.Id,
             Name = vehicle.Person.Name,
        },
    });

Используя связи между таблицами, вам больше не нужно присоединяться к внешнему ключу. Entity Framework поймет, что требуется объединение (не уверен, действительно ли это также для ef-core)

0 голосов
/ 24 июня 2018

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

Ниже сказано, что у Человека много транспортных средств.

public class Person
{
    public virtual List<Vehicle> vehicles { get; set; }
}

Ниже говорится, что Автомобиль принадлежит Лицу

public class Vehicle
{
    public virtual Person person { get; set; }
}

Так что оба одинаковы.

...