Entity Framework Core - вставка данных со значениями внешнего ключа - PullRequest
0 голосов
/ 22 марта 2020

Я использую ядро ​​EF и подход CodeFirst для работы с моей базой данных и очень плохо знаком с ними. Я создал 3 модельных класса (IncomeTypes, AdIncomes и ученики), и их отношения таковы:

  1. 1: M отношения между IncomeTypes и AdIncomes
  2. 1: M отношения между студентами и AdIncomes

Мой вопрос: как мне вставить данные в таблицу AdIncomes с помощью внешних ключей (ITId и Add_No)?

Моя кодировка выглядит следующим образом:

AdIncomes.cs ( Полный код )

public class AdIncomes
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int AdIncomeId { get; set; }

        [Required]
        [DataType(DataType.Date)]
        public DateTime CreateDate { get; set; }

        [Required]
        public decimal Amount { get; set; }

        public decimal DueAmount { get; set; }

        [Required]
        [MaxLength(10)]
        public string Status { get; set; }

}

IncomeTypes.cs

 public class IncomeTypes
    {

        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int ITId { get; set; }
        [Required]
        [Display(Name = "Income Type Name")]
        [MaxLength(20)]
        public string ITName { get; set; }
        [Required]
...
 public ICollection<AdIncomes> AdIncomes { get; set; }
 }

Student.cs

public class Students
    {
        [Key]
        [Required]
        [Display(Name = "Admission No")]

        [MaxLength(10)]
        public string Add_No { get; set; }

        [Required]
        [Display(Name = "Name In Full")]
        [MaxLength(150)]
        public string F_Name { get; set; }
       ...
    public ICollection<AdIncomes> AdIncomes { get; set; }
}

DbContext.cs ( Полный код )

public class ConnectionString:DbContext
{
public ConnectionString(DbContextOptions<ConnectionString> options) : base(options) { }

public DbSet<AdIncomes> AdIncomes { get; set; }
public DbSet<IncomeTypes> IncomeTypes { get; set; }
public DbSet<Students> Students { get; set; }
}

AdIncomesController.cs

var incometypes2 = _context.IncomeTypes.Where(x => x.ITName.ToLower() == "admission fee").ToList();
AdIncomes AdI = new AdIncomes { 
CreateDate = DateTime.Now,
DueDate = DateTime.Now.AddDays(90),
Amount = incometypes2[0].Amount,
DueAmount = incometypes2[0].Amount,  
Status = "N", };
_context.Add(AdI);
await _context.SaveChangesAsync();

Ответы [ 2 ]

0 голосов
/ 23 марта 2020

При создании вашей модели внешний ключ будет по умолчанию генерироваться в базе данных. Но если вы хотите вставить данные в таблицу AdIncomes с внешними ключами. Вам необходимо добавить ключ к вашей модели, как показано ниже:

public class AdIncomes
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int AdIncomeId { get; set; }

    [Required]
    [DataType(DataType.Date)]
    public DateTime CreateDate { get; set; }

    [Required]
    public decimal Amount { get; set; }

    public decimal DueAmount { get; set; }

    [Required]
    [MaxLength(10)]
    public string Status { get; set; }

    public int IncomeTypesITId  { get; set; }
    public IncomeTypes IncomeTypes { get; set; }
    public string StudentsAdd_No { get; set; }
    public Students Students { get; set; }
}
public class IncomeTypes
{

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ITId { get; set; }
    [Required]
    [Display(Name = "Income Type Name")]
    [MaxLength(20)]
    public string ITName { get; set; }
    [Required]
    public ICollection<AdIncomes> AdIncomes { get; set; }
}
public class Students
{
    [Key]
    [Required]
    [Display(Name = "Admission No")]

    [MaxLength(10)]
    public string Add_No { get; set; }

    [Required]
    [Display(Name = "Name In Full")]
    [MaxLength(150)]
    public string F_Name { get; set; }
    public ICollection<AdIncomes> AdIncomes { get; set; }
}

Контроллер:

//get the specific incometype
var incometypes2 = _context.IncomeTypes.Where(x => x.ITName.ToLower() == "admission fee").ToList();
//get the specific student
var student = _context.Students.Where(x => x.F_Name.ToLower() == "stu2").ToList();

AdIncomes AdI = new AdIncomes
{
    CreateDate = DateTime.Now,
    Status = "N",
    IncomeTypesITId = incometypes2[0].ITId,//add the foreign key
    StudentsAdd_No = student[0].Add_No  //add the foreign key

};
_context.Add(AdI);
await _context.SaveChangesAsync();

DbContext:

public class Mvc2_2Context : DbContext
{
    public Mvc2_2Context (DbContextOptions<Mvc2_2Context> options)
        : base(options)
    {
    }
    public DbSet<AdIncomes> AdIncomes { get; set; }
    public DbSet<IncomeTypes> IncomeTypes { get; set; }
    public DbSet<Students> Students { get; set; }
}

Результат: enter image description here

Из-за изменения модели. не забудьте add-migration newMigration и update-database.

0 голосов
/ 22 марта 2020

Вам нужно сохранить объект или внешний ключ в своем классе AdIncome. Entitiy Framework Core: учебник "один ко многим" .

Вот еще один учебник: Ядро Entity Framework: учебник "один ко многим"

public class AdIncomes
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int AdIncomeId { get; set; }

    [Required]
    [DataType(DataType.Date)]
    public DateTime CreateDate { get; set; }

    [Required]
    public decimal Amount { get; set; }

    public decimal DueAmount { get; set; }

    [Required]
    [MaxLength(10)]
    public string Status { get; set; }

    // you'll want to add your objects or foreign keys
    public Student Student { get; set; }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...