我有一个非常简单的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