如何EF代码第一个流畅的API字符串主键?

时间:2015-10-26 08:48:57

标签: string entity-framework ef-code-first migration primary-key

我尝试为成员实体创建主键,我不想使用注释,只需使用流畅的API:

Member{
    public string MemberID {get;set;}
    ...
}

在MemberMapping中

this.hasKey(t=>t.MemberID);

更新数据库时出现此错误:

Identity column 'MemberID' must be of data type int, bigint, smallint, tinyint, or decimal or numeric with 
a scale of 0, and constrained to be nonnullable

2 个答案:

答案 0 :(得分:2)

EF支持string作为PK,但是当您需要创建Member的实例并将其保存到数据库中时,必须明确设置该属性的值。默认情况下,EF中唯一的identity类型为int。为了解决您的问题,我认为您有两种选择:

  1. 将数据库中的MemberID列更改为Identity。这应该可以解决问题。
  2. 如果您希望EF为您做更改,请添加此配置:

    this.hasKey(t=>t.MemberID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
    

    使用Add-Migration命令创建新迁移,并尝试再次运行Update-Database命令。

  3. 现在,如果您的数据库中的MemberID列不是Identity,并且您尝试在模型中将Identity PK属性设置为MemberID,那么可能是你问题的原因。如果是这种情况,请删除该配置并尝试再次运行Update-Database命令。

    来自Programming Entity Framework Code First的书,第44页:

      

    如果密钥字段是Integer,则代码优先默认为   DatabaseGeneratedOption.Identity。使用Guid,您需要明确   配置这个。 这些是您可以配置的唯一类型   Code First正在生成数据库时Identity

答案 1 :(得分:1)

问题不是PK而是身形。你应该有像

这样的东西
plt.plot(0, 0)
plt.tick_params(
axis='both',          
which='both',
bottom='off',      
top='off',         
left='off',      
right='off', 
labelleft='off',
labelbottom='off',
labelsize=8)

a = plt.axes([.36, .2, .6, .6])
plt.tick_params(
    axis='both',
    which='both',     
    labelsize=8)
a.spines['left'].set_position('center')
a.spines['bottom'].set_position('center')
a.spines['right'].set_color('none')
a.spines['top'].set_color('none')
a.xaxis.set_ticks_position('bottom')
a.yaxis.set_ticks_position('left')
plt.plot(x,y1, 'g--',label='m$_{1}$=' +str(mass1)+'M$_{\odot}$')
plt.plot(x,y2, 'b--',label='m$_{2}$=' +str(mass2)+'M$_{\odot}$')
plt.plot(x,y1n, 'g--')
plt.plot(x,y2n, 'b--')
plt.plot(start1[0],start1[1], 'xr',label='Position at \ntime t=0')
plt.plot(start2[0],start2[1], 'xr')
plt.plot(stop1[0],stop1[1], 'og', label='Position at \ntime t=' +     str(t) + ' yr')
plt.plot(stop2[0],stop2[1], 'og')
plt.text(-75,-10, r'Binary period ' + str(period(m1+m2,a1+a2)) + 'yr',fontsize=8)
plt.text(-75,-15, r'm$_{1}$ period ' + str(period(m1,a1)) + ' yr',fontsize=8)
plt.text(-75,-20, r'm$_{2}$ period ' + str(period(m2,a2)) + ' yr',fontsize=8)
plt.text(-75,-25, r'a$_{1}$ = ' + str(a1) + ' AU', fontsize=8)
plt.text(-75,-30, r'b$_{1}$ = ' + str(sigfigs(LOSorbit(0,a1))) + ' AU',fontsize=8)
plt.text(-75,45, 'Apparent Orbits of Circular Binary System', fontsize=8, fontweight='bold')
plt.text(-75,-35, r'a$_{2}$ = ' + str(a2) + ' AU', fontsize=8)
plt.text(-75,-40, r'b$_{2}$ = ' + str(sigfigs(LOSorbit(0,a2))) + ' AU',fontsize=8)
plt.xlabel('x /AU', fontsize=8)
h = plt.ylabel('y /AU', fontsize=8)
h.set_rotation(0)
a.xaxis.set_label_coords(1.06, 0.54)
a.yaxis.set_label_coords(0.55, 1.01)
plt.savefig('binary_sys.pdf', bbox_inches='tight')
plt.grid()
box = a.get_position()
a.set_position([box.x0, box.y0, box.width * 0.8, box.height])
a.legend(numpoints=1,loc='center left',bbox_to_anchor=(-0.46, 0.75),prop={'size':8})
plt.show()