Свободные отношения API: отношение один к одному или ноль - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть две таблицы 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 в таблице Cargo является первичным ключом.Столбец 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 нет идентификатора 1.(1 означает значение CargoMovement)

Я ищу решение Fluent API.

1 Ответ

0 голосов
/ 21 февраля 2019

Для Fluent Api вам нужно использовать вызов WithMany () без параметров, чтобы установить внешний ключ, как вы можете видеть здесь: Ассоциации внешнего ключа «один к одному» , поэтому новый код будет:

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; }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...