it-swarm.com.de

Was bedeutet das hauptsächliche Ende einer Assoziation in einer 1: 1-Beziehung im Entitätsrahmen?

public class Foo
{
    public string FooId{get;set;}
    public Boo Boo{get;set;}
}


public class Boo
{
    public string BooId{get;set;}
    public Foo Foo{get;set;}
}

Ich habe versucht, dies in Entity Framework zu tun, als ich den Fehler erhielt:

Das Hauptende einer Zuordnung zwischen den Typen "ConsoleApplication5.Boo" und "ConsoleApplication5.Foo" kann nicht ermittelt werden. Das Hauptende dieser Zuordnung muss explizit mithilfe der API für Beziehungsfluss oder mithilfe von Datenanmerkungen konfiguriert werden.

Ich habe Fragen zu StackOverflow mit einer Lösung für diesen Fehler gesehen, möchte aber verstehen, was der Begriff "Hauptende" bedeutet.

263

In einer Eins-zu-Eins-Beziehung muss ein Ende das Haupt- und das zweite das abhängige Ende sein. Das Hauptende ist dasjenige, das zuerst eingefügt wird und das ohne das abhängige existieren kann. Das abhängige Ende ist dasjenige, das nach dem Principal eingefügt werden muss, da es einen Fremdschlüssel für den Principal hat.

Im Fall von Entity Framework muss FK in Dependent auch sein PK sein. In Ihrem Fall sollten Sie also Folgendes verwenden:

public class Boo
{
    [Key, ForeignKey("Foo")]
    public string BooId{get;set;}
    public Foo Foo{get;set;}
}

Oder fließendes Mapping

modelBuilder.Entity<Foo>()
            .HasOptional(f => f.Boo)
            .WithRequired(s => s.Foo);
373
Ladislav Mrnka

Sie können auch die [Required] Datenanmerkungsattribut, um dies zu lösen:

public class Foo
{
    public string FooId { get; set; }

    public Boo Boo { get; set; }
}

public class Boo
{
    public string BooId { get; set; }

    [Required]
    public Foo Foo {get; set; }
}

Foo ist erforderlich für Boo.

178

Dies bezieht sich auf die Antwort von @Ladislav Mrnka zur Verwendung von fluent api für die Konfiguration einer Eins-zu-Eins-Beziehung.

Hatte eine Situation, in der es nicht möglich war, FK of dependent must be it's PK Zu haben.

Zum Beispiel hat Foo bereits eine Eins-zu-Viele-Beziehung zu Bar.

public class Foo {
   public Guid FooId;
   public virtual ICollection<> Bars; 
}
public class Bar {
   //PK
   public Guid BarId;
   //FK to Foo
   public Guid FooId;
   public virtual Foo Foo;
}

Jetzt mussten wir eine weitere Eins-zu-Eins-Beziehung zwischen Foo und Bar hinzufügen.

public class Foo {
   public Guid FooId;
   public Guid PrimaryBarId;// needs to be removed(from entity),as we specify it in fluent api
   public virtual Bar PrimaryBar;
   public virtual ICollection<> Bars;
}
public class Bar {
   public Guid BarId;
   public Guid FooId;
   public virtual Foo PrimaryBarOfFoo;
   public virtual Foo Foo;
}

So legen Sie eine Eins-zu-Eins-Beziehung mithilfe der fließenden API fest:

modelBuilder.Entity<Bar>()
            .HasOptional(p => p.PrimaryBarOfFoo)
            .WithOptionalPrincipal(o => o.PrimaryBar)
            .Map(x => x.MapKey("PrimaryBarId"));

Beachten Sie, dass beim Hinzufügen von PrimaryBarId entfernt werden muss, da wir dies über die fließende API festlegen.

Beachten Sie auch, dass der Methodenname [WithOptionalPrincipal()][1] irgendwie ironisch ist. In diesem Fall ist der Auftraggeber Bar. WithOptionalDependent () Beschreibung auf MSDN macht es klarer.

5
Sudarshan_SMD