我有两个表Cargo
和CargoMovement
如下:
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; }
}
每个Cargo
可以有一个或零个CargoMovement
。每个CargoMovement
都会有一个Cargo
。
CargoID
是主键。 CargoID
中的CargoMovement
列应为外键。
但是当我编写以下流利的API时,情况恰恰相反。
modelBuilder.Entity<PisMark3.Models.Cargo.Cargo>()
.HasOptional(c => c.CargoMovement)
.WithRequired(cg => cg.Cargo)
.WillCascadeOnDelete(false);
导致迁移:
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);
这意味着当我尝试插入
insert into dbo."CargoMovements" ("TimeOfTransit","CargoID")
values(NOW(),44)//44 is existing CargoID in Cargo table
给我一个错误,dbo.Cargo
表中没有id 1。 (1是CargoMovement
的标识值)
我正在寻找Fluent API解决方案。
答案 0 :(得分:1)
对于Fluent Api,您需要使用无参数WithMany()调用来设置外键,如下所示:One-to-One Foreign Key Associations 因此新的代码应为:
modelBuilder.Entity<PisMark3.Models.Cargo.CargoMovement>()
.HasRequired(cg => cg.Cargo)
.WithMany()
.HasForeignKey(cg => cg.CargoID);
对于数据注释,请尝试添加:
[Required, ForeignKey("Cargo")]
在CargoID上方,像这样:
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; }
}