我有一个非常简单的C#类,其中包含一个主键。我正在使用代码优先的EF 6,但有两个问题:


如何在代码优先时将主键作为Identity设置(以及如何不使其成为标识)?我的某些班级需要PK作为身份(添加时自动递增),而某些班级则需要通过代码分配它。
当我尝试使用以下方法将类保存到数据库时:

// This code is actually wrapped by a BusinessContext Class to encapsulate the ORM representation
context.Costumers.Add(costumer); //exception is here!
context.SaveChanges();


我的类在Add方法上收到以下异常:


  在模型生成期间检测到一个或多个验证错误:
  
  M.Costumer :: EntityType'Costumer'尚未定义键。定义此EntityType的键。
  Costumers:EntityType:EntitySet'Costumers'基于未定义键的'Costumer'类型。



这是类本身:

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],所以为什么会有一个例外,说没有键?

最佳答案

实体框架必须具有用于任何[Key]属性的getter和setter。

如果要指定EF,您将为此字段生成值,则可以使用[DatabaseGeneratedOption.None]

DatabaseGeneratedOption枚举具有3个不同的值:


已计算-插入或更新行时,数据库会生成一个值。
身份-插入行时数据库生成一个值。
无-数据库不生成值。


键值的默认值为DatabaseGeneratedOption.Identity

10-07 12:55