使用MySQL的EF5 Code First GUID

时间:2012-10-31 23:15:33

标签: c# mysql code-first entity-framework-5 fluent-interface

我确信我只是遗漏了一些显而易见的东西,但我似乎无法使下面的代码正常运行。

这是我使用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'

的列说明符不正确

关于我哪里出错的任何想法?

1 个答案:

答案 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 objectDisabling 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();
}