Que signifie fin principale d’une association dans la relation 1: 1 dans le cadre des entités

public class Foo { public ssortingng FooId{get;set;} public Boo Boo{get;set;} } public class Boo { public ssortingng BooId{get;set;} public Foo Foo{get;set;} } 

J’essayais de le faire dans Entity Framework quand j’ai eu l’erreur:

Impossible de déterminer la fin principale d’une association entre les types ‘ConsoleApplication5.Boo’ et ‘ConsoleApplication5.Foo’. L’extrémité principale de cette association doit être explicitement configurée à l’aide de l’API de relation fluide ou des annotations de données.

J’ai vu des questions sur StackOverflow avec une solution à cette erreur, mais je veux comprendre ce que signifie le terme “extrémité principale”.

    Dans une relation un à un, une extrémité doit être principale et la seconde doit être dépendante. La fin principale est celle qui sera insérée en premier et qui peut exister sans la dépendance. La fin dépendante est celle qui doit être insérée après le principal car elle a une clé étrangère au principal.

    Dans le cas d’une structure d’entité, FK en dépend doit également être son PK, donc dans votre cas, vous devez utiliser:

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

    Ou une cartographie fluide

     modelBuilder.Entity() .HasOptional(f => f.Boo) .WithRequired(s => s.Foo); 

    Vous pouvez également utiliser l’atsortingbut d’annotation de données [Required] pour résoudre ce problème:

     public class Foo { public ssortingng FooId { get; set; } public Boo Boo { get; set; } } public class Boo { public ssortingng BooId { get; set; } [Required] public Foo Foo {get; set; } } 

    Foo est requirejs pour Boo .

    Ceci est en référence à la réponse de @Ladislav Mrnka sur l’utilisation de l’api fluide pour configurer la relation un-à-un.

    Si une situation où une FK of dependent must be it's PK n’était pas possible.

    Par exemple, Foo déjà une relation un à plusieurs avec 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; } 

    Maintenant, nous avons dû append une autre relation entre Foo et Bar.

     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; } 

    Voici comment spécifier une relation un-à-un en utilisant un api fluide:

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

    Notez que lors de l’ajout de PrimaryBarId doit être supprimé, car nous le PrimaryBarId via api fluide.

    Notez également que le nom de la méthode [WithOptionalPrincipal()][1] est [WithOptionalPrincipal()][1] ironique. Dans ce cas, Principal est Bar. La description WithOptionalDependent () sur msdn le rend plus clair.