Divisione di tabelle del framework di quadro: non nella stessa gerarchia di tipi / non hanno una relazione di chiave esterna valida per una

Sto utilizzando Entity Framework 6 con un approccio Code-First e voglio che due quadro vengano inserite nella stessa tabella. Che cosa sto facendo di sbagliato?

[Table("Review")] public class Review { public int Id { get; set; } public PictureInfo PictureInfo { get; set; } public int PictureInfoId { get; set; } } [Table("Review")] public class PictureInfo { [Key, ForeignKey("Review")] public int ReviewId { get; set; } public Review Review { get; set; } } 

L’errore che ottengo: I tipi di entity framework ‘PictureInfo’ e ‘Review’ non possono condividere la tabella ‘Review’ perché non si trovano nella stessa gerarchia di tipi o non hanno una relazione di chiave esterna valida con una chiave primaria corrispondente tra loro.

Che cosa sto facendo di sbagliato?

Sono riuscito a ottenere ciò che volevi con api fluenti. Fluent API offre opzioni di configurazione molto più ricche rispetto alle annotazioni di dati. Ho cambiato un po ‘le tue classi di quadro:

 public class Review { public int Id { get; set; } public PictureInfo PictureInfo { get; set; } } 

La proprietà PictureInfoId non è necessaria poiché la relazione della chiave esterna verrà eseguita sulle chiavi primarie di entrambe le quadro.

 public class PictureInfo { public int Id { get; set; } public Review Review { get; set; } } 

Poiché Review e PictureInfo saranno mappati sulla stessa tabella di cui hanno bisogno per condividere la stessa colonna della chiave primaria, per PictureInfo e Review questa colonna dovrebbe avere lo stesso nome. Se si desidera mantenere la proprietà della chiave primaria PictureInfo denominata ReviewId, è ansible farlo, ma sarà necessario quindi mappare il suo nome su “Id”. Finalmente il DbContext:

 public class MyDbContext : DbContext { protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity().HasKey( e => e.Id ); modelBuilder.Entity() .HasRequired(e => e.PictureInfo) .WithRequiredDependent(e => e.Review); modelBuilder.Entity().Map(m => m.ToTable("Review")); modelBuilder.Entity().Map(m => m.ToTable("Review")); modelBuilder.Entity().HasKey(e => e.Id); base.OnModelCreating(modelBuilder); } public DbSet Reviews { get; set; } public DbSet PictureInfos { get; set; } } 

OnModelCreating contiene una definizione di mapping api fluente. Tutto quello che devi fare è definire le chiavi primarie su entrambe le quadro con lo stesso nome, associare quelle 2 quadro con la relazione 1-1 e quindi associarle alla stessa tabella.

Sembra che il problema fosse che la relazione era interpretata come da uno a 0. 1 invece di uno a uno.

La chiave esterna int PictureInfoId sul fine Review non era necessaria / ignorata, quindi il suo non-nullability non rendeva necessaria la revisione della relazione. La rimozione di questa chiave non necessaria e l’aggiunta dell’attributo [Richiesto] alla proprietà di navigazione di PictureInfo lo hanno risolto.

Ecco la class di revisione corretta.

 [Table("Review")] public class Review { public int Id { get; set; } [Required] public PictureInfo PictureInfo { get; set; } } 

L’altro modo per risolvere questo problema è creare una vista con solo i campi desiderati. Quindi mappare l’entity framework alla vista.

(Questi test ed errori sono stati scritti contro EF 6.1.3)

Primo tentativo

 [Table("Review")] public class Review { [Key] public int Id { get; set; } public PictureInfo PictureInfo { get; set; } } [Table("Review")] public class PictureInfo { [Key] public int Id { get; set; } public Review Review { get; set; } } 

Con le quadro di cui sopra ho ricevuto questo errore:

Imansible determinare la fine principale di un’associazione tra i tipi. La fine principale di questa associazione deve essere configurata in modo esplicito utilizzando l’API della relazione fluente o le annotazioni di dati.

Secondo tentativo

 [Table("Review")] public class Review { [Key] public int Id { get; set; } [Required] public PictureInfo PictureInfo { get; set; } } [Table("Review")] public class PictureInfo { [Key] public int Id { get; set; } [Required] public Review Review { get; set; } } 

I tipi di quadro “Review” e “PictureInfo” non possono condividere la tabella “Review” perché non si trovano nella stessa gerarchia di tipi o non hanno una relazione di coppia esterna valida con una chiave primaria corrispondente tra loro.

Terzo tentativo

 [Table("Review")] public class Review { [Key] public int Id { get; set; } [Required, ForeignKey("Id")] public PictureInfo PictureInfo { get; set; } } [Table("Review")] public class PictureInfo { [Key] public int Id { get; set; } [Required, ForeignKey("Id")] public Review Review { get; set; } } 

Imansible determinare la fine principale di un’associazione tra i tipi. La fine principale di questa associazione deve essere configurata in modo esplicito utilizzando l’API della relazione fluente o le annotazioni di dati.

Codice di lavoro

 [Table("Review")] public class Review { [Key, ForeignKey("PictureInfo")] public int Id { get; set; } public PictureInfo PictureInfo { get; set; } } [Table("Review")] public class PictureInfo { [Key, ForeignKey("Review")] public int Id { get; set; } public Review Review { get; set; } } 
 using System.Linq; using System.Data.Entity; namespace Sample { 

  class Program { static void Main(string[] args) { using (var context = new EmployeeDBContext()) { var result = context.Set().Include(x => x.Department).ToArray(); } } } 

  public class EmployeeDBContext : DbContext { public EmployeeDBContext() : base("EmployeeDB") { } public DbSet Employee { get; set; } public DbSet Department { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity().ToTable("Departments").HasKey(x => x.DepartmentId); modelBuilder.Entity().ToTable("Employees").HasKey(x => x.Id); //ForeignKey mapping modelBuilder.Entity().HasRequired(x => x.Department).WithMany().HasForeignKey(x => x.DepartmentId); base.OnModelCreating(modelBuilder); } } 

  //Domain Entity public class Employee { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public Department Department { get; set; } public int DepartmentId { get; set; } } //Domain Entity public class Department { public int DepartmentId { get; set; } public string DepartmentName { get; set; } } } 

L’errore è causato dal fatto che la definizione della tabella è duplicata nella direttiva della tabella “PictureInfo”. Devi solo modificare questa direttiva.

[Table (“Review”)] public class Review {…}

[Table (“Review”)] public class PictureInfo {…}

per

[Table (“Review”)] public class Review {…}

[Tabella (” PictureInfo “)] class pubblica PictureInfo {…}