EF Core - репозиторий, модель или модель представления - PullRequest
1 голос
/ 21 июня 2019

Для начала, вот мои классы:

public class Name
{
    public int NameId {get;set;}
    public string Value {get;set;}
    [ForeignKey("Name_NameId")]
    public ICollection<PersonName> PersonsName {get;set;}
}

public class NameType
{
    public int NameTypeId {get;set;}
    public string Value {get;set;}
    [ForeignKey("NameType_NameTypeId")]
    public ICollection<PersonName> PersonsName {get;set;}
}

public class Person
{
    public int PersonId {get;set;}
    public string Suffix {get;set;}
    public datetime DateOfBirth {get;set;}
    [ForeignKey("Person_PersonId")]
    public ICollection<PersonName> PersonsName {get;set;}
}

public class PersonName
{
    public int Person_PersonId {get;set;}
    public int Name_NameId {get;set;}
    public int NameType_NameTypeId {get;set;}
    public int Order {get;set;}
}

В идеале, при доступе к классу Person я хотел бы иметь возможность вызывать функцию (или свойство), которая может получить полное имя человекаиз репозитория PersonName.Однако я не совсем уверен, как это сделать.Для примера данных в этих таблицах:

NameId               Value
1                    John
2                    Jacob
3                    Jingleheimer
4                    Schmidt

NameTypeId           Value
1                    First Name
2                    Middle Name
3                    Last Name
4                    Nickname

PersonId             Suffix                 DateOfBirth
1                                           01/01/1900

Person_PersonId      Name_NameId            NameType_NameTypeId        Order
1                    1                      1                          0
1                    2                      2                          0
1                    3                      2                          1
1                    4                      3                          0

Итак, в классе Person я хотел бы иметь функцию / свойство, такое как GetFullName () / FullName, где он будет возвращать «John Jacomb Jingleheimer Schmidt»,Я работал над учебником с нуля, и после создания каждого класса они создают интерфейс, макетный репозиторий и работают над репозиторием БД.Однако я хотел бы передать информацию в представление через модель представления, но я не уверен, как связать класс с хранилищем и т. Д. Есть ли кто-нибудь, кто может указать мне учебник, который может объяснить, чтолучше или объяснить это для меня?Спасибо.

Ответы [ 3 ]

2 голосов
/ 25 июня 2019

На мой взгляд, ваши таблицы слишком сложны.Недостатком является то, что вам нужно объединить так много таблиц только для того, чтобы получить чье-то полное имя ... и из-за всех объединений вы можете столкнуться с проблемами производительности ... этот код будет трудно понять и поддерживать другим разработчикам.

Итак, я знаю, что не отвечаю на ваш вопрос напрямую, но я бы порекомендовал вам упростить дизайн таблицы.

Почему бы не использовать простую таблицу, такую ​​как:

public class Person
{
    public int PersonId { get; set; }
    public string FirstName { get; set;}
    public string MiddleName { get; set;}
    public string LastName { get; set; }
    public string NickName { get; set; }
    public string Suffix { get; set; }
    public datetime DateOfBirth { get; set; }

    // it is a lot easier to implement GetFullName() method here than joining so many tables
    public string GetFullName()
    {
        retun FirstName + " " + MidleName + " " + LastName;
    }
}

Мне очень трудно понять вашу последнюю таблицу: PersonName

public class PersonName
{
    public int Person_PersonId { get; set; }
    public int Name_NameId { get; set; }
    public int NameType_NameTypeId { get; set; }
    public int Order { get; set; } // <-- Why putting Order in PersonName?
}

Для меня Order не является логическим столбцом в таблице PersonName ... Я не совсем понимаю ваш дизайн иЯ могу быть совершенно неправ ... но для меня это похоже на чрезмерно спроектированный дизайн.

0 голосов
/ 29 июня 2019

Для отображения вашей модели просмотра.Вы можете использовать это.

public class PersonDTO
{
    public int PersonId { get; set; }
    public string FirstName { get; set;}
    public string MiddleName { get; set;}
    public string LastName { get; set; }
    public string NickName { get; set; }
    public string Suffix { get; set; }
    public datetime DateOfBirth { get; set; }

    public string GetFullName()
    {
        retun FirstName + " " + MidleName + " " + LastName;
    }
}

Для сопоставления FirstName, MiddleName, LastName, NickName.Вы можете использовать.

public void MapToPersonDTO(){

    var selectedPerson = _context.Person.FirstOrDefault(m => m.PersonId == 1);

    var personDto = new PersonDTO(){
        FirstName = _context.Name.FirstOrDefault(n=>n.NameId == selectedPerson.PersonsName.FirstOrDefault(f=>f.NameType_NameTypeId == 1)).Value,
        MiddleName= _context.Name.FirstOrDefault(n=>n.NameId == selectedPerson.PersonsName.FirstOrDefault(f=>f.NameType_NameTypeId == 2)).Value,
        LastName  = _context.Name.FirstOrDefault(n=>n.NameId == selectedPerson.PersonsName.FirstOrDefault(f=>f.NameType_NameTypeId == 3)).Value,
        NickName  = _context.Name.FirstOrDefault(n=>n.NameId == selectedPerson.PersonsName.FirstOrDefault(f=>f.NameType_NameTypeId == 4)).Value,
    };
}
0 голосов
/ 29 июня 2019

Надеюсь, я правильно понял ваши вопросы

Я сделал некоторые предположения, хотя

Я использовал ваши классы для создания базы данных и запросил базу данных, чтобы другие таблицы былисвязаны отношениями

Если вы передаете id этого человека, а также предполагаете, что dbcontext доступен и создан в классе внутри класса, тогда вызовите GetFullName

public string GetPersonById(int personId)
{
    var person = db_context.PersonNames.FirstOrDefault(m => m.Person_PersonId == personId);
    //did not check for null here
    var name = person.Person.PersonNames.ToList();
    var fullname = "";
    name.ForEach(m => fulname += m.Name.Value + " ");
    return fullname;
}

public virtual string GetFullName
{
    get { return GetPersonById(PersonId); }// the person id passed, the class if instantiated can call this instance PersonId
    set { ; }
}

Также выВы можете получить данные из базы данных в модели, которые у вас есть, и метод работает отлично.Передав их из БД, вы получите возможность взаимодействия, и Razor Engine может оказать большую помощь в View, но

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

public void UseModel()
{
    var people = _context.People.ToList();
    var names = _context.Names.ToList();
    var name_types = _context.NameTypes.ToList();

    List<PersonModel> ps = new List<PersonModel>();

    people.ForEach(m =>
    {
        ps.Add(new PersonModel
        {
            PersonId = m.PersonId,
            Suffix = m.Suffix,
            DateOfBirth = m.DateOfBirth,
            PersonsName = null//I suggest you use mapping here see https://stackoverflow.com/questions/16118085/best-practices-for-mapping-one-object-to-another
            //use mapping to map the list or use a fooloop to construct it before this declaration and assign it here
        });
    });
    //do for names and name_types

}

Вы также можете передать эти данные в View как объект PersonName, который имеет все

...