2017-07-25 15 views
1

外部キーを持つデータベーステーブルにデータを挿入する際に問題があります。 はエラーとして、私は EFコアID列の明示的な値を挿入

がテーブルにID列に明示的な値を挿入することはできません

を取得しています 「MachineTypes」IDENTITY_INSERTはテーブル内のID列の 明示的な値を挿入OFF.Cannotに設定されているときに「SpareTypes」 IDENTITY_INSERTがあるときOFFに設定します。

BaseEntity.cs

public abstract class BaseEntity 
{ 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public Int64 Id { get; set; } 

    public DateTime CreateDate { get; set; } 
} 

MachineType.cs

public class MachineType : BaseEntity 
{ 
    [Required] 
    [StringLength(50)] 
    public string Name { get; set; } 
} 

SpareType.cs

public class SpareType : BaseEntity 
    { 
     [Required] 
     [StringLength(25)] 
     public string Name { get; set; } 
    } 

SparePart.cs

public class SparePart : BaseEntity 
{ 
[Required] 
[StringLength(100)] 
public string InternalCode { get; set; } 

[StringLength(4096)] 
public string Description { get; set; } 

[StringLength(255)] 
public string NameOnFolder { get; set; } 

public decimal? Enter { get; set; } 

public decimal? Exit { get; set; } 

public decimal? Thickness { get; set; } 

public string Band { get; set; } 

public string Color { get; set; } 

public bool Elastic { get; set; } 

[Required] 
public virtual MachineType MachineType { get; set; } 

[Required] 
public virtual SpareType SpareType { get; set; } 
} 

SparePartViewModel.cs

public class SparePartViewModel 
    { 
     public int Id { get; set; } 

     public DateTime CreateDate { get; set; } 

     [Required] 
     [StringLength(100)] 
     public string InternalCode { get; set; } 

     [StringLength(4096)] 
     public string Description { get; set; } 

     [StringLength(255)] 
     public string NameOnFolder { get; set; } 

     public decimal? Enter { get; set; } 

     public decimal? Exit { get; set; } 

     public decimal? Thickness { get; set; } 

     public string Band { get; set; } 

     public string Color { get; set; } 

     public bool Elastic { get; set; } 



     [Required] 
     public virtual MachineType MachineType { get; set; } 

     [Required] 
     public virtual SpareType SpareType { get; set; } 
    } 

コントローラのすべてのデータが正しくキャッチされている投稿の際

[Route("/api/v1/items")] 
public class SparePartController : Controller 
{ 
private IRepository<SparePart> _repoSparePart; 


public SparePartController(IRepository<SparePart> repoSparePart) 
{ 
    _repoSparePart = repoSparePart; 

} 

[HttpPost("")] 
public async Task<IActionResult> Post([FromBody]SparePartViewModel viewModel) 
{ 
    if (ModelState.IsValid) 
    { 
     var newItem = Mapper.Map<SparePart>(viewModel); 
     newItem.CreateDate = DateTime.Now; 

     _repoSparePart.Insert(newItem); 

     if (await _repoSparePart.SaveChangesAsync()) 
     { 
      return Created($"items/{newItem.InternalCode}", Mapper.Map<SparePartViewModel>(viewModel)); 
     } 
    } 
    return BadRequest("Failed to save."); 
} 

}

AppContext.cs

public class AppContext : IdentityDbContext<ApplicationUser> 
    { 
     private IConfigurationRoot _config; 

     public AppContext(IConfigurationRoot config, DbContextOptions options) : base(options) 
     { 
      _config = config; 
     } 

     public DbSet<SpareType> SpareTypes { get; set; } 
     public DbSet<MachineType> MachineTypes { get; set; } 
     public DbSet<SparePart> SpareParts { get; set; } 

     protected override void OnModelCreating(ModelBuilder builder) 
     { 
      builder.Entity<SpareType>() 
       .HasIndex(s => new { s.Name }) 
       .IsUnique(true); 

      builder.Entity<MachineType>() 
       .HasIndex(s => s.Name) 
       .IsUnique(true); 


      base.OnModelCreating(builder); 
     } 

     protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 
     { 
      base.OnConfiguring(optionsBuilder); 
      optionsBuilder.UseSqlServer(_config["ConnectionStrings:RndDbContextConnection"]); 
     } 
    } 

を投稿するための、しかし、いつ詰まるべきかデータベースに書き込まれました。私はエラーが発生しています。 enter image description here

答えて

3

新しいSparePartインスタンスを挿入するときは、MachineTypeとSpareTypeの参照をあらかじめ同じDbContextからフェッチする必要があります。それ以外の場合、EFは新しいMachineTypeとSpareTypeを作成しようとしていると考えます。 Idフィールドが設定されているため、データベースは挿入を許可しません。そのような何か:

newItem.MachineType = _context.MachineTypes.Find(<some_id>); 
newItem.SpareType = _context.SpareTypes.Find(<some_id>); 
context.SpareParts.Add(newItem); 
context.SaveChanges(); 

あなたがすることができるもう一つは、モデルの外部キーを公開している、DbSetに追加する前に、新しいインスタンス上でそれを設定するのに十分です。スペアパーツ:

[ForeignKey("MachineType")] 
public Int64 MachineTypeId { get; set; } 

[ForeignKey("SpareType")] 
public Int64 SpareTypeId{ get; set; } 
+0

ありがとうございました。深くて長い調査で、私はこれも見つけました。 –

関連する問題