Ho il seguente modello di dati:
public class Foo
{
public Foo(int barId)
{
BarId = barId;
}
private int BarId;
public Bar Bar { get; private set; }
}
public class FooTypeConfig : IEntityTypeConfiguration<Foo>
{
public void Configure(EntityTypeBuilder<Foo> builder)
{
builder.HasOne(x => x.Bar)
.WithMany()
.HasForeignKey("BarId");
}
}
public class Bar
{
public int Id { get; private set; }
}
Funziona benissimo e secondo le mie aspettative, ho una tabella Foo
contenente Id
e BarId
. Anche il mio campo privato BarId
e la mia proprietà Bar
sono materializzati correttamente durante la lettura di Foo
dal database.
Il problema è che vorrei trovare un modo per assegnare un nome al mio campo privato e scegliere un nome diverso per la colonna del mio database. Vorrei nominare la mia proprietà _barId
e comunque scegliere BarId
come nome della mia colonna nel mio database.
È possibile?
Ho provato a rinominare il campo nella mia classe Foo
e specificare la mia chiave _barId
(ora non convenzionalmente denominata) _barId
in EntityTypeConfiguration
builder.HasOne(x => x.Bar).WithMany().HasForeignKey("_barId");
Ciò ha comportato che EF BarId
ancora una colonna BarId
, senza utilizzarla come chiave esterna per la tabella Bar
...
migrationBuilder.CreateTable(
name: "Foos",
columns: table => new
{
Id = table.Column<int>(nullable: false)
.Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
BarId = table.Column<int>(nullable: true),
_barId = table.Column<int>(nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Foos", x => x.Id);
table.ForeignKey(
name: "FK_Foos_Bars__barId",
column: x => x._barId,
principalTable: "Bars",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
Innanzitutto, EF associa le colonne del database e gli FK alle proprietà dell'entità, non ai campi. Le proprietà possono essere reali o come nel tuo caso - ombra .
Quindi la seguente riga:
builder.HasOne(x => x.Bar).WithMany().HasForeignKey("BarId");
mappa la Bar
-> relazione Foo
FK con una proprietà dell'ombra Foo
chiamata BarId
e dovrebbe rimanere così com'è.
Utilizzare il metodo Property
per configurare il tipo di proprietà, il campo di supporto, il nome della colonna, il tipo e altri attributi. Per esempio:
builder.Property<int>("BarId") // or int? etc.
.HasField("_barId")
.HasColumnName("BarId"); // or BazId or whatever you like
Assicurati solo di usare lo stesso nome di proprietà quando lo definisci e quando specifichi l'FK. È inoltre possibile utilizzare Entry(entity).Property(propertyName)
per ottenere / impostare il valore, contrassegnarlo come modificato ecc., Nonché EF.Property(entity, propertyName
) per accedervi all'interno delle query LINQ to Entities.