流利的API关系:一对一或零关系ip

时间:2019-02-21 09:25:21

标签: .net entity-framework linq entity-framework-6 ef-code-first

我有两个表CargoCargoMovement如下:

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解决方案。

1 个答案:

答案 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; }
    }