Following his line of reasoning, a Franquia may have a franchise list, and that’s exactly what’s missing when you use it DataAnnotations.
For this, you should also use the annotation InverseProperty to perform the appropriate mapping of navigation properties.
Your code will look like this:
public class Franquia
{
[Key]
public int FranquiaId { get; set; }
public int? FranquiaMasterId { get; set; }
public int? FranquiaSeniorId { get; set; }
[ForeignKey("FranquiaMasterId")]
public virtual Franquia FranquiaMaster { get; set; }
[ForeignKey("FranquiaSeniorId")]
public virtual Franquia FranquiaSenior { get; set; }
[InverseProperty("FranquiaMaster")]
public ICollection<Franquia> FranquiasMasters { get; set; }
[InverseProperty("FranquiaSenior")]
public ICollection<Franquia> FranquiasSeniors { get; set; }
}
There is the possibility to make Fluent API, that would look this way:
modelBuilder.Entity<Franquia>()
.HasOptional(s => s.FranquiaMaster)
.WithMany(s => s.FranquiasMasters)
.HasForeignKey(s => s.FranquiaMasterId);
modelBuilder.Entity<Franquia>()
.HasOptional(s => s.FranquiaSenior)
.WithMany(s => s.FranquiasSeniors)
.HasForeignKey(s => s.FranquiaSeniorId);
If using Migrations and whenever the table is created, and no change, the generated Migration will have this code:
public partial class addFranquias : DbMigration
{
public override void Up()
{
CreateTable(
"dbo.Franquias",
c => new
{
FranquiaId = c.Int(nullable: false, identity: true),
FranquiaMasterId = c.Int(),
FranquiaSeniorId = c.Int(),
})
.PrimaryKey(t => t.FranquiaId)
.ForeignKey("dbo.Franquias", t => t.FranquiaMasterId)
.ForeignKey("dbo.Franquias", t => t.FranquiaSeniorId)
.Index(t => t.FranquiaMasterId)
.Index(t => t.FranquiaSeniorId);
}
public override void Down()
{
DropForeignKey("dbo.Franquias", "FranquiaSeniorId", "dbo.Franquias");
DropForeignKey("dbo.Franquias", "FranquiaMasterId", "dbo.Franquias");
DropIndex("dbo.Franquias", new[] { "FranquiaSeniorId" });
DropIndex("dbo.Franquias", new[] { "FranquiaMasterId" });
DropTable("dbo.Franquias");
}
}
And to top it off, you’ll have the following SQL which will be executed at the bank:
CREATE TABLE [dbo].[Franquias] (
[FranquiaId] [int] NOT NULL IDENTITY,
[FranquiaMasterId] [int],
[FranquiaSeniorId] [int],
CONSTRAINT [PK_dbo.Franquias] PRIMARY KEY ([FranquiaId])
)
CREATE INDEX [IX_FranquiaMasterId] ON [dbo].[Franquias]([FranquiaMasterId])
CREATE INDEX [IX_FranquiaSeniorId] ON [dbo].[Franquias]([FranquiaSeniorId])
ALTER TABLE [dbo].[Franquias] ADD CONSTRAINT [FK_dbo.Franquias_dbo.Franquias_FranquiaMasterId] FOREIGN KEY ([FranquiaMasterId]) REFERENCES [dbo].[Franquias] ([FranquiaId])
ALTER TABLE [dbo].[Franquias] ADD CONSTRAINT [FK_dbo.Franquias_dbo.Franquias_FranquiaSeniorId] FOREIGN KEY ([FranquiaSeniorId]) REFERENCES [dbo].[Franquias] ([FranquiaId])
It worked @randrade really was missing the
InverseProperty! Thank you– Lucas Ost