Ho due tavoli Cargo
e CargoMovement
come segue:
public class Cargo
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int CargoID { get; set; }
public string description { get; set; }
public virtual CargoMovement CargoMovement { get; set; }
}
public class CargoMovement
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
public DateTime TimeOfTransit { get; set; }
public int CargoID { get; set; }
public virtual Cargo Cargo { get; set; }
}
Ogni Cargo
potrebbe avere ONE o Zero CargoMovement
. Ogni CargoMovement
avrà esattamente un Cargo
.
CargoID
in Cargo table è la chiave primaria. CargoID
colonna CargoID
in CargoMovement
deve essere la chiave esterna.
Ma quando scrivo la seguente API fluente, succede il contrario.
modelBuilder.Entity<PisMark3.Models.Cargo.Cargo>()
.HasOptional(c => c.CargoMovement)
.WithRequired(cg => cg.Cargo)
.WillCascadeOnDelete(false);
migrazione risultante:
CreateTable(
"dbo.CargoMovements",
c => new
{
ID = c.Int(nullable: false, identity: true),
TimeOfTransit = c.DateTime(nullable: false),
CargoID = c.Int(nullable: false),
})
.PrimaryKey(t => t.ID)
.ForeignKey("dbo.Cargoes", t => t.ID)
.Index(t => t.ID);
Il che significa che quando provo a inserire
insert into dbo."CargoMovements" ("TimeOfTransit","CargoID")
values(NOW(),44)//44 is existing CargoID in Cargo table
Mi dà un errore che non ci sia id 1 nella tabella dbo.Cargo
. (1 è il valore identitario di CargoMovement
)
Sto cercando la soluzione API Fluent.
Per Fluent Api è necessario utilizzare una chiamata WithMany () senza parametri per impostare la chiave esterna, come si può vedere qui: Associazioni di chiavi esterne one-to-one in modo che il nuovo codice sia:
modelBuilder.Entity<PisMark3.Models.Cargo.CargoMovement>()
.HasRequired(cg => cg.Cargo)
.WithMany()
.HasForeignKey(cg => cg.CargoID);
Per le anotations di dati prova ad aggiungere:
[Required, ForeignKey("Cargo")]
Sopra CargoID come questo:
public class CargoMovement
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
public DateTime TimeOfTransit { get; set; }
[Required, ForeignKey("Cargo")]
public int CargoID { get; set; }
public virtual Cargo Cargo { get; set; }
}