Mam następujący model:

public class Child
{
    public int Id { get; set; }
}

public class Parent
{
    public int Id { get; set; }
    public List<Child> Childs { get; set; }
}

Bez dalszych instruowania, rdzeń EF 3.1 automatycznie napisza relację odniesienia między {X0}} i Child i generuje następującą migrację tworzącą nieważne kolumny klucz obcych na Child Tabela:

....

migrationBuilder.CreateTable(
        name: "Child",
        columns: table => new
        {
            Id = table.Column<int>(nullable: false)
                .Annotation("SqlServer:Identity", "1, 1"),
            ParentId = table.Column<int>(nullable: true)   // <--- !!
        },
        constraints: table =>
        {
            table.PrimaryKey("PK_Child", x => x.Id);
            table.ForeignKey(
                name: "FK_Child_Parent_ParentId",
                column: x => x.ParentId,
                principalTable: "Parent",
                principalColumn: "Id",
                onDelete: ReferentialAction.Restrict);
        });

Skutkujące schemat poniżej:

enter image description here

Potrzebuję, aby fk był jednak nieważny . Jak egzekwować EF, aby zrobić to bez Zmiana modelu (bez konieczności wprowadzania właściwości sztucznych wyłącznie w celu określenia podstawowych relacji magazynowych)?


.. PS: W szczególności chcę uniknąć nadużywania modelu, wprowadzając dwukierunkowe odniesienia, tylko aby móc wyrazić to, czego potrzebuję, np.

public class Child
{
    public int Id { get; set; }
    public Parent Parent { get; set; }   // <--- not acceptable
}

modelBuilder.Entity<Parent>()
    .HasMany(p => p.Childs)
    .WithOne(c => c.Parent)
    .IsRequired();   // <--- non-null

Czy instrukcja jest ingerencja do kodu migracyjnego Jedynym rozwiązaniem (nie powoduje niedopasowania z migawką modelową)?

1
jwaliszko 18 styczeń 2020, 15:11

1 odpowiedź

Najlepsza odpowiedź

Ponieważ jednostka zależna nie ma właściwości nawigacji referencyjnej, na której należy umieścić [Required] atrybutu lub użyć typu odniesienia C # 8 (np. Parent vs Parent?) i nie ma wyraźnej właściwości FK z non Typ nieważny (np. int vs int?), jedyną pozostałą opcją jest płynne interfejsy API.

Relacja płynna interfejs API wymaga co najmniej poprawna Has + With Para, a następnie w tym konkretnym przypadku IsRequired() Metoda:

modelBuilder.Entity<Parent>()
    .HasMany(e => e.Childs) // collection navigation property
    .WithOne() // no reference navigation property
    .IsRequired();
2
Ivan Stoev 18 styczeń 2020, 13:48