我确信我只是遗漏了一些显而易见的东西,但我似乎无法使下面的代码正常运行。
这是我使用Guid的POCO课程之一:
public class Player
{
public virtual Guid PlayerID { get; set; }
public virtual int? GuildID { get; set; }
public virtual int AccountNumber { get; set; }
public virtual string UserName { get; set; }
public virtual Guild Guild { get; set; }
public virtual ICollection<Coordinate> Coordinates { get; set; }
}
使用Fluent API链接到它自己的配置类:
public class PlayerConfiguration : EntityTypeConfiguration<Player>
{
public PlayerConfiguration()
{
ToTable("Players", "ACDB");
Property(p => p.PlayerID)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
Property(p => p.UserName).HasMaxLength(25);
}
}
然后使用DbContext注册配置。
我得到的错误如下:列'PlayerID'
的列说明符不正确关于我哪里出错的任何想法?
答案 0 :(得分:1)
我认为这里发生的是实体框架将PlayerID
列创建为GUID(MySql中的UUID),然后将AUTO_INCREMENT
属性应用于它。
来自http://docs.oracle.com/cd/E17952_01/refman-5.5-en/numeric-type-attributes.html似乎AUTO_INCREMENT
仅对整数列有效,这可能是您收到此错误的原因。
我认为在这里尝试的是将PlayerID
从Guid更改为int - 这至少应该缩小错误原因。
修改1
从Convert and modify a model field as an DataColumn object和Disabling identity (auto-incrementing) on integer primary key using code first,您应该可以使用以下命令关闭自动递增:
HasKey(p => p.PlayerID)
Property(p => p.PlayerID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None)
修改2
至少在SQL Server上,使用Property(p => p.PlayerID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None)
将导致在创建新行时插入空Guid(尽管假设它在其他地方会以这种方式运行似乎是合理的)。我能看到的唯一明智的解决方法是填充PlayerID
构造函数中的Player
:
public Player()
{
this.PlayerID = Guid.NewGuid();
}