【问题标题】:Fluent API relationships: one to one or zero relationsipFluent API 关系:一对一或零关系
【发布时间】:2019-02-21 09:25:21
【问题描述】:

我有两张表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

Cargo 表中的CargoID 是主键。 CargoMovement 中的 CargoID 列应该是外键。

但是当我编写以下 fluent 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 解决方案。

【问题讨论】:

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


    【解决方案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; }
        }
    

    【讨论】:

    • 我想用fluent api来做这个
    • 编辑了我的答案,希望对您有所帮助
    • .HasForeignKey 不可用。智能感知中的唯一选项是 MapWillCascadeOnDelete
    • 想通了,但现在呢?
    • 但是一件货物不能有多个货物运输
    猜你喜欢
    • 1970-01-01
    • 2019-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-03
    • 2014-01-11
    相关资源
    最近更新 更多