J'ai deux tables Cargo
et CargoMovement
comme suit:
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; }
}
Chaque Cargo
peut avoir UN ou zéro CargoMovement
. Chaque CargoMovement
aura exactement une Cargo
.
CargoID
dans le tableau de chargement est la clé primaire. CargoID
colonne CargoID
dans CargoMovement
devrait être la clé étrangère.
Mais lorsque j'écris l'API fluide suivante, l'inverse se produit.
modelBuilder.Entity<PisMark3.Models.Cargo.Cargo>()
.HasOptional(c => c.CargoMovement)
.WithRequired(cg => cg.Cargo)
.WillCascadeOnDelete(false);
migration résultante:
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);
Ce qui signifie que lorsque j'essaie d'insérer
insert into dbo."CargoMovements" ("TimeOfTransit","CargoID")
values(NOW(),44)//44 is existing CargoID in Cargo table
Cela me donne une erreur qu'il n'y a pas d'identifiant 1 dans la table dbo.Cargo
. (1 étant la valeur d'identité de CargoMovement
)
Je cherche une solution API Fluent.
Pour Fluent Api, vous devez utiliser un appel WithMany () sans paramètre pour définir la clé étrangère comme vous pouvez le voir ici: Associations de clé étrangère un-à-un, de sorte que le nouveau code serait:
modelBuilder.Entity<PisMark3.Models.Cargo.CargoMovement>()
.HasRequired(cg => cg.Cargo)
.WithMany()
.HasForeignKey(cg => cg.CargoID);
Pour les annotations de données, essayez d'ajouter:
[Required, ForeignKey("Cargo")]
Au-dessus de CargoID, comme ceci:
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; }
}