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();
у вас должен быть список цитат с внутренними объектами (заметки и контакты), и вы можете использовать свойства навигации.