ef 7 Inserting when IDENTITY_INSERT is set to OFF problems c# entity-framework visual-studio-2015


When I try to save to my database I get the error

SqlException: Cannot insert explicit value for identity column in table 'Photo' when IDENTITY_INSERT is set to OFF.

I am using 5 MVC 6 with EF 7 on Visual Studio 2015 There are a lot of similar questions. Most have solutions that are not supported by 5 MVC 6 or EF 7(One said to use a Data Annotation that would fix the problem in EF 6). The others have not worked. I try not to ask except as a last resort.

My design is that every user will have many folders, and a folder will have many photos.

I added public ICollection<UserFolder> UserFolders { get; set; } to ApplicationUser

The Model:

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; }


The Controller method

// POST: Photos/Create
    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;


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

The View:

    @model FamPhotos.Models.Photo

    ViewData["Title"] = "Create";


<form asp-action="Create" asp-controller="Photos" method="post" enctype="multipart/form-data">
    <div class="form-horizontal">
        <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 class="col-md-offset-2 col-md-10">
            <input type="submit" value="Create" class="btn btn-default" />

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

@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>

My DbContext:

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

            // 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; }


1/19/2016 6:46:33 PM

Accepted Answer

If you want to insert a primary key into the database don't have an Identity on the database Column.

The error message is stating that you are trying to choose a primary key, and the database wants to choose one for you.

Either turn the identity off or allow the database to choose the primary key.

1/19/2016 6:52:21 PM

Popular Answer

If you do not want an ID to be database generated, then you should use the DatabaseGenerated attribute on your model, as in

public class MyModel
    public int ID {get;set;}

This attribute is in fact supported in EF7.


Related Questions


Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow
Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow