Это странная структура для отображения.Конструктивно это выглядит как 1 к 0, 1, но в принципе это выглядит как 1 к многим.Для 1-ко-многим я бы ожидал, что структура таблицы будет больше похожа на:
Заявитель (ApplicantId | Имя)
ApplicantNote (ApplicantNoteId | ApplicantId | Примечание)
Это будет отображено в EF что-то вроде:
public class Applicant
{
public int ApplicantId { get; set; }
public string Name { get; set; }
public virtual ICollection<ApplicantNote> { get; set; } = new List<ApplicantNote>();
}
public class ApplicantNote
{
public int ApplicantNoteId { get; set; }
public virtual Applicant Applicant { get; set; }
}
public class ApplicantConfig : EntityTypeConfiguration<Applicant>
{
public ApplicantConfig()
{
ToTable("Applicant");
HasKey(x => x.ApplicantId);
HasMany(x => x.ApplicantNotes)
.WithRequired(x => x.Applicant)
.Map(x => x.MapKey("ApplicantId"));
}
}
public class ApplicantNoteConfig : EntityTypeConfiguration<ApplicantNote>
{
public ApplicantNoteConfig()
{
ToTable("ApplicantNote");
HasKey(x => x.ApplicantNoteId);
}
}
То, что у вас есть, больше похоже на таблицу «Заявитель», которая содержит примечание, но тогда есть дополнительнаятаблица, которая может содержать одну дополнительную дополнительную заметку.
Заявитель (ApplicantId | Имя | Примечание)
ExtraApplicantNote (ApplicantId | Примечание) // Имя не требуется.
, который в 1-к-0.1 будет выглядеть примерно так:
public class Applicant
{
public int ApplicantId { get; set; }
public string Name { get; set; }
public string Note { get; set; }
public ExtraApplicantNote ExtraApplicantNote { get; set; }
}
public class ExtraApplicantNote
{
public int ApplicantId { get; set; }
public string Note { get; set; }
public virtual Applicant Applicant { get; set; }
}
public class ApplicantConfig : EntityTypeConfiguration<Applicant>
{
public ApplicantConfig()
{
ToTable("Applicant");
HasKey(x => x.ApplicantId);
HasOptional(x => x.ExtraApplicantNote)
.WithRequired(x => x.Applicant);
}
}
public class ExtraApplicantNoteConfig : EntityTypeConfiguration<ExtraApplicantNote>
{
public ExtraApplicantNoteConfig()
{
ToTable("ExtraApplicantNote");
HasKey(x => x.ApplicantId);
}
}
Это присоединяет эту дополнительную запись заметки кандидата к заявителю какнеобязательный связанный объект.При выборе в качестве графа сущностей:
var applicant = context.Applicants
.Include(x => x.ExtraApplicantNote)
.Single(x => x.ApplicantId == applicantId);
, например ..., затем получите доступ к заметкам через applicant.Note
и applicant?.ExtraApplicantNote.Note
, чтобы учесть тот факт, что дополнительная заметка кандидата является необязательной.
Чтобы получить выходные данные всех заметок с указанием их сведений о заявителе, создать структуру 1-ко-многим гораздо проще:
var notes = context.ApplicantNotes.Select(x => new
{
x.Applicant.ApplicantId,
x.Applicant.Name,
x.Note
}).ToList();
Чтобы сделать то же самое с 1-to-0..1 немного сложнее:
var notes = context.Applicants.Select(x => new
{
x.ApplicantId,
x.Name,
x.Note
}).Union(context.ExtraApplicantNotes.Select(x => new
{
x.ApplicantId,
x.Applicant.Name,
x.Note
})).ToList();
Это включает в себя сначала извлечение заметок из первой таблицы, затем использование объединения для объединения тех же деталей из необязательных записей во второй таблице.
** Редактировать ** Извините, я перечитал вопрос, и вы хотите, чтобы вторая таблица переопределила первую.
В этом случае аналогично приведенному выше:
var notes = context.ExtraApplicantNotes.Select(x => new
{
x.ApplicantId,
x.Applicant.Name,
x.Note
}).Union(context.Applicants
.Where(x => x.ExtraApplicant == null)
.Select(x => new
{
x.ApplicantId,
x.Name,
x.Note
})).ToList();