Mi piacerebbe mappare qualcosa come questo:
public class FooPair
{
public int Id { get; set; }
public Foo Foo1 { get; set; }
public Foo Foo2 { get; set; }
}
public class Foo
{
public int Id { get; set; }
public FooPair Parent { get; set; }
}
E il mio DbContext:
public class FooContext : DbContext
{
public DbSet<Foo> Foos { get; set; }
public DbSet<FooPair> Pairs { get; set; }
}
EF si lamenta che è in grado di determinare la relazione rappresentato dalla Parent
proprietà di navigazione.
L'unica soluzione che potrei pensare è creare due nuove classi ereditate da Foo
, quindi EF le mapperà ai loro stessi tavoli e otterrò due relazioni 1 a 1, ma questo non sembra giusto.
Quale sarebbe il modo corretto di modellare tale situazione?
Penso che il codice sottostante aiuti a risolvere il tuo problema. fare riferimento a Eftutorials per maggiori dettagli.
public class Foo
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public virtual FooPair FooPair { get; set; }
}
public class FooPair
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public virtual ICollection<Foo> Foos { get; set; }
public Foo()
{
Foos = new List<Foo>();
}
}
Usando EF Code Innanzitutto puoi farlo in questo modo
Si consiglia di includere la proprietà della chiave esterna in una classe di entità. Ad esempio, se l'entità Foo include la proprietà FooPairId che diventa automaticamente proprietà foreignkey perché segue la convenzione per l'ID <Type Name> foreignkey.
public class FooPair
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public Foo Foo1 { get; set; }
public Foo Foo2 { get; set; }
public virtual Foo Foo { get; set; }
}
public class Foo
{
public Foo()
{
FooPairs = new List<FooPair>();
}
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public int FooPairId { get; set; }
[ForeignKey("FooPairId")]
public ICollection<FooPair> FooPairs { get; set; }
}