[英]EF5 Code First GUIDs with MySQL
我确定我只是缺少一些明显的东西,但是我似乎无法使以下代码正常运行。
这是我的使用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”的列说明符不正确
关于我要去哪里的任何想法?
我认为这里发生的是,实体框架将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更改为PlayerID
这至少应缩小错误原因的范围。
编辑1
首先,通过使用代码 将“模型”字段转换为DataColumn对象并将其修改为DataColumn对象并禁用整数主键上的标识(自动递增),您应该能够通过以下方式关闭自动递增功能:
HasKey(p => p.PlayerID)
Property(p => p.PlayerID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None)
编辑2
至少在SQL Server上,使用Property(p => p.PlayerID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None)
将导致在创建新行时插入空的Guid(尽管合理的做法是假定它会在其他地方以这种方式运行) )。 我可以看到的唯一明智的解决方法是在Player
构造函数中填充PlayerID
:
public Player()
{
this.PlayerID = Guid.NewGuid();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.