Pytanie Jak ustawić klucz obcy w klasie EntityTypeConfiguration


Właśnie zacząłem tworzyć klasę EntityTypeConfiguration i podążałem za nią

public class Xyz
{
   public int PlaceId { get; set; }

    public string  Name { get; set; }

    public DbGeography Location { get; set; }

    public int HumanTypeId { get; set; }

    public int AddressId { get; set; }
}

oraz w klasie EntityTypeConfiguration

 public sealed class XyzConfiguration:EntityTypeConfiguration<Xyz>
{
    public XyzConfiguration()
    {
        ToTable("Place", "dbo");
        HasKey(p => p.PlaceId);   
        Property(p => p.PlaceId)
            .HasColumnName("PlaceId")
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

        Property(p => p.Name);
        Property(p => p.Location). ;
        Property(p => p.HumanTypeId);
        Property(p => p.AddressId);
    }
}

Teraz, jak ustawić DbGeography i kolumny klucza obcego HumanTypeId , AddressId ?

Z góry dziękuję


14
2017-09-15 05:05


pochodzenie




Odpowiedzi:


To zależy od tego, co zrobisz z kolumnami. Jeśli masz obce kolumny, takie jak AddressIdprawdopodobnie masz trochę Address podmioty, które chcesz powiązać ze swoim Xyz podmioty. Musisz zdecydować, w jaki sposób entites odnoszą się do siebie nawzajem i skonfigurować mapowanie, które chcesz między nimi.

Będziesz potrzebował właściwości nawigacji w swoim systemie Address klasa lub twoja Xyz class, w przeciwnym razie nie ma nic, co by wiązało klucz obcy, a twoje zagraniczne kolumny ID byłyby traktowane jako zwykłe kolumny (co jest w porządku, jeśli tego chcesz).

Tak więc, jeśli chcesz dodać właściwość nawigacji do swojej Xyz jednostka

public class Xyz
{
    // Your code
    public int AddressId { get; set; }
    public virtual Address MyAddress { get; set; }
}

// Your Address class
public class Address
{
    public int ID;
}

Możesz skonfigurować mapowanie, robiąc coś wzdłuż tych linii (będzie się różnić w zależności od relacji:

public sealed class XyzConfiguration : EntityTypeConfiguration<Xyz>
{
    public XyzConfiguration()
    {
        // Your code.

        this.HasOptional(x => x.MyAddress)      // Your Xyz has an optional Address
            .WithMany()                         // Address may be owned by many Xyz objects
            .HasForeignKey(x => x.AddressId);   // Use this foreign key.
    }
}

Nie próbowałem używać typów przestrzennych i EF, ale zacznę tutaj: http://msdn.microsoft.com/en-us/data/hh859721.aspx

Na początku tworzenia stron EF znajdziesz mnóstwo informacji na temat konfiguracji mapowania: http://msdn.microsoft.com/en-us/data/ee712907 spróbuj "Płynny interfejs API - konfigurowanie / mapowanie właściwości i typów"

Istnieje również nieco skrócone wyjaśnienie różnych typów skojarzeń tutaj: Code First: Independent association vs. Foreign key association?


29
2017-09-15 12:22



możesz wypowiedzieć się na temat różnicy między używaniem DbContext skonfigurować encję i używając EntityTypeConfiguration ? - mmcrae
Cześć, nie pracowałem z EF przez kilka lat, więc moja wiedza jest trochę zardzewiała. Nie mogę od razu powtórzyć konfiguracji mapowania za pomocą DbContext, czy istnieje konkretny przykład, którego szukasz? - Chris
@mmcrae Nie ma znaczenia, gdzie konfigurujesz swoje jednostki. Jeśli wolisz to zrobić w swojej nadpisującej metodzie OnModelCreating, musisz napisać ten sam kod. W tym przypadku byłoby to coś w stylu modelBuilder.Entity <Xyz> (). Map (..... itp., Itp. Lubię lepiej mieć indywidualne pliki na modele. Wyobraź sobie, że masz ponad 100 modeli i wszystkie twoje mapowania są napisane wewnątrz tej metody OnModelCreating ... DŁUGI fragment kodu. - Pepito Fernandez