2016-01-19 48 views
3

當我嘗試保存到我的數據庫中,我得到的錯誤asp.net EF當IDENTITY_INSERT設置爲OFF問題7插入

SQLEXCEPTION:不能在表中插入的標識列的顯式值「照片」時IDENTITY_INSERT被設置爲OFF。

我在Visual Studio 2015上使用asp.net 5 MVC 6與EF 7 有很多類似的問題。大多數解決方案都不支持asp.net 5 MVC 6或EF 7(一種說法是使用數據註釋來解決EF 6中的問題)。其他人沒有工作。我儘量不要問,除非是最後的手段。

我的設計是每個用戶都有很多文件夾,並且一個文件夾會有很多照片。

我加public ICollection<UserFolder> UserFolders { get; set; }到ApplicationUser

的型號:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Threading.Tasks; 
using System.ComponentModel.DataAnnotations.Schema; 

namespace FamPhotos.Models 
{ 
    public class UserFolder 
    { 
     public int ID { get; set; } 
     public string Name { get; set; } 

     public ICollection<Photo> Photo { get; set; } 

     public string ApplicationUserId { get; set; } 
     public virtual ApplicationUser ApplicationUser { get; set; } 
    } 

    public class Photo 
    { 
     public int ID { get; set; } 
     public string Description { get; set; } 
     public DateTime UploadDate { get; set; } 
     public string Url { get; set; } 

     public int UserFolderId { get; set; } 
     public UserFolder UserFolder { get; set; } 

    } 
} 

在控制器方法

// POST: Photos/Create 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public async Task<IActionResult> Create(Photo photo, IFormFile files, int id) 
    { 
     if (files == null) 
     { 
      ModelState.AddModelError(string.Empty, "Please select a file to upload."); 
     } 
     else if (ModelState.IsValid) 
     { 
      photo.UploadDate = DateTime.Now; 
      photo.UserFolderId = id; 

      var folderName = _context.UserFolder.Where(q => q.ID == id).Single().Name; 

      //TODO: Check for image types 
      var fileName = photo.ID.ToString() + ContentDispositionHeaderValue.Parse(files.ContentDisposition).FileName.Trim('"'); 
      var filePath = Path.Combine(_applicationEnvironment.ApplicationBasePath, "Photos", User.GetUserName(), folderName, fileName); 
      await files.SaveAsAsync(filePath); 

      photo.UserFolder = _context.UserFolder.Where(q => q.ID == id).Single(); 
      photo.Url = "~/Photos/" + fileName; 

      _context.Add(photo); 
      _context.SaveChanges(); 


      return RedirectToAction("Index"); 
     } 
     return View(photo); 
    } 

的觀點:

@model FamPhotos.Models.Photo 

@{ 
    ViewData["Title"] = "Create"; 
} 

<h2>Create</h2> 

<form asp-action="Create" asp-controller="Photos" method="post" enctype="multipart/form-data"> 
    <div class="form-horizontal"> 
     <h4>Photo</h4> 
     <hr /> 
     <div asp-validation-summary="ValidationSummary.ModelOnly" class="text-danger"></div> 
     <input type="file" name="files" /> 
     <label asp-for="Description" class="col-md-2 control-label"></label> 
     <div class="col-md-10"> 
      <input asp-for="Description" class="form-control" /> 
      <span asp-validation-for="Description" class="text-danger" /> 
     </div> 
     <div class="col-md-offset-2 col-md-10"> 
      <input type="submit" value="Create" class="btn btn-default" /> 
     </div> 
    </div> 
</form> 

<div> 
    <a asp-action="Index">Back to List</a> 
</div> 

@section Scripts { 
    <script src="~/lib/jquery/dist/jquery.min.js"></script> 
    <script src="~/lib/jquery-validation/dist/jquery.validate.min.js"></script> 
    <script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"></script> 
} 

我DbCon文字:

namespace FamPhotos.Models 
{ 
    public class ApplicationDbContext : IdentityDbContext<ApplicationUser> 
    { 
     protected override void OnModelCreating(ModelBuilder builder) 
     { 
      builder.Entity<UserFolder>() 
       .HasMany(q => q.Photo) 
       .WithOne(c => c.UserFolder) 
       .HasForeignKey(c => c.UserFolderId); 



      base.OnModelCreating(builder); 
      // Customize the ASP.NET Identity model and override the defaults if needed. 
      // For example, you can rename the ASP.NET Identity table names and more. 
      // Add your customizations after calling base.OnModelCreating(builder); 
     } 
     public DbSet<Photo> Photo { get; set; } 
     public DbSet<ApplicationUser> ApplicationUser { get; set; } 
     public DbSet<UserFolder> UserFolder { get; set; } 
    } 
} 

謝謝。

+0

您對此錯誤感到困惑。 IDENTITY_INSERT OFF表示數據庫不允許插入和標識值(當您擁有標識列時,這是正常情況)。例如,如果您正在恢復一堆包含身份密鑰的記錄,並且希望覆蓋更新中的密鑰值或在插入中指定它,則可以打開IDENTITY_INSERT。 ON意味着允許你插入一個身份。 –

+0

您的OnModelCreating不完整。看看這個問題的答案。 http://stackoverflow.com/questions/15258571/performing-an-identity-insert-using-ef5-code-first-migrations – granadaCoder

回答

2

如果要將主鍵插入數據庫,請在數據庫列上沒有標識。

錯誤消息指出您正在嘗試選擇主鍵,並且數據庫要爲您選擇一個主鍵。

關閉標識或允許數據庫選擇主鍵。

+0

已將ID更改爲PhotoID和UserFolderID。我想我已經讀過,要麼我會做我想做的。 –

相關問題