Исключение первичного ключа Entity Framework

У меня есть очень простой класс С#, который содержит один первичный ключ. Я использую EF 6 с первым кодом, и у меня есть два вопроса:

  1. Как мне сделать первичный ключ как Identity в первом коде (и как не сделать его идентификатором)? Некоторым из моих классов требуется, чтобы PK был идентификатором (автоматическое увеличение при добавлении), а некоторым нужно, чтобы он назначался кодом.

  2. #P3#
    // This code is actually wrapped by a BusinessContext Class to encapsulate the ORM representation
    context.Costumers.Add(costumer); //exception is here!
    context.SaveChanges();
    
    #P4# <цитата> #P5# #P6#

а это сам класс:

using Microsoft.Practices.Prism.Mvvm;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MyApp.Models
{
    public class Costumer : BindableBase
    {
        private string name;
        private string city;
        private Estado state;
        private int costumerId;

        [Required]
        [StringLength(500)]        
        public string Name
        {
            get { return this.name; }
            set { SetProperty(ref name, value); }
        }

        [Required]
        [StringLength(500)]
        public string City
        {
            get { return this.city; }
            set { SetProperty(ref city, value); }
        }

        [Required]
        public State State
        {
            get { return this.state; }
            set { SetProperty(ref state, value); }
        }

        [Required]
        [Key]
        public int CostumerId
        {
            get { return this.costumerId; }            
        } 
    }
}

У класса есть [Key], так почему же существует исключение, говорящее, что ключа нет?


person Michel Feinstein    schedule 12.03.2015    source источник
comment
Key не может иметь приватный сеттер.   -  person Claies    schedule 12.03.2015


Ответы (2)


Entity Framework должен иметь метод получения и установки для любых атрибутов [Key].

Если вы хотите указать EF, что вы будете генерировать значения для этого поля, вы можете использовать [DatabaseGeneratedOption.None].

DatabaseGeneratedOption Перечисление имеет 3 разных значения:

  • Вычисляется — база данных генерирует значение при вставке или обновлении строки.
  • Идентификация. База данных генерирует значение при вставке строки.
  • None -- база данных не генерирует значения.

Значение по умолчанию для ключевого значения — DatabaseGeneratedOption.Identity.

person Claies    schedule 12.03.2015
comment
Но в этом конкретном классе я хочу, чтобы БД автоматически генерировала идентификатор с использованием идентификатора... поэтому я удалил установщик, поскольку не имеет особого смысла иметь возможность устанавливать что-то, что БД должна устанавливать... как это сделать Я настраиваю его как личность? - person Michel Feinstein; 12.03.2015
comment
Итак, почему Microsoft заставляет вас иметь сеттер, если даже они делают Identity по умолчанию? (что означает, что набор все равно будет проигнорирован) - person Michel Feinstein; 12.03.2015
comment
установщик не игнорируется, он используется внутри EF для установки значения в объекте из возврата при вставке. Он также используется для заполнения значения при поиске в базе данных. - person Claies; 12.03.2015

используйте атрибут [DatabaseGeneratedOption.None] в своем ключе.

person tech-gayan    schedule 12.03.2015