Entity Framework Core Mapping Несколько объектов на объект в один ко многим

Я пытаюсь найти лучший способ обработки объекта Note, который связан с несколькими объектами, например, контакты, цитаты. Эти объекты могут иметь много Заметок, Цитата имеет много Заметок.

public class Note
{
    public int Id { get; set; }
    public string Title { get; set; }        
    public string NoteDetails { get; set; }
    public DateTime CreatedDate { get; set; }

    public int? ContactId { get; set; }
    public int? QuoteId { get; set; }

    public Contact NoteContact { get; set; }
    public Quote NoteQuote { get; set; }
}

public class Contact
{
    public int Id { get; set; }
    public string Name { get; set; }        
    public string Address { get; set; }

    public ICollection<Note> Notes { get; set; }
}

public class Quote    {
    public int Id { get; set; }
    public string Title { get; set; }        
    public string Description { get; set; }

    public ICollection<Note> Notes { get; set; }
}

Это просто случай добавления внешних ключей в заметки к контактам, цитаты и т. Д.? Тогда виртуальные коллекции Notes в объекте Contact, Quotes and Invoices?

Я надеюсь, что я понимаю, чего я пытаюсь достичь.

Спасибо

1 ответ

Имея такую ​​модель (возможно, это не совсем то, что вы хотите, но вы понимаете):

public class Note
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string NoteDetails { get; set; }
    public DateTime CreatedDate { get; set; }


    public Quote Quote { get; set; }
    public Contact Contact { get; set; }
}

public class Contact
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Address { get; set; }

    public ICollection<Note> Notes { get; set; }
}

public class Quote
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }

    public ICollection<Note> Notes { get; set; }
}

Создадим эту миграцию:

migrationBuilder.CreateTable(
    name: "Contacts",
    columns: table => new
    {
        Id = table.Column<int>(nullable: false)
            .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
        Address = table.Column<string>(nullable: true),
        Name = table.Column<string>(nullable: true)
    },
    constraints: table =>
    {
        table.PrimaryKey("PK_Contacts", x => x.Id);
    });

migrationBuilder.CreateTable(
    name: "Quotes",
    columns: table => new
    {
        Id = table.Column<int>(nullable: false)
            .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
        Description = table.Column<string>(nullable: true),
        Title = table.Column<string>(nullable: true)
    },
    constraints: table =>
    {
        table.PrimaryKey("PK_Quotes", x => x.Id);
    });

migrationBuilder.CreateTable(
    name: "Notes",
    columns: table => new
    {
        Id = table.Column<int>(nullable: false)
            .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
        ContactId = table.Column<int>(nullable: true),
        CreatedDate = table.Column<DateTime>(nullable: false),
        NoteDetails = table.Column<string>(nullable: true),
        QuoteId = table.Column<int>(nullable: true),
        Title = table.Column<string>(nullable: true)
    },
    constraints: table =>
    {
        table.PrimaryKey("PK_Notes", x => x.Id);
        table.ForeignKey(
            name: "FK_Notes_Contacts_ContactId",
            column: x => x.ContactId,
            principalTable: "Contacts",
            principalColumn: "Id",
            onDelete: ReferentialAction.Restrict);
        table.ForeignKey(
            name: "FK_Notes_Quotes_QuoteId",
            column: x => x.QuoteId,
            principalTable: "Quotes",
            principalColumn: "Id",
            onDelete: ReferentialAction.Restrict);
    });

И, наконец, делать что-то вроде этого:

var quotes = _db.Quotes.Include(q => q.Notes).ThenInclude(n => n.Contact).ToList();

у вас должен быть список цитат с внутренними объектами (заметки и контакты), и вы можете использовать свойства навигации.

Другие вопросы по тегам