繁体   English   中英

带有MySQL的EF5代码优先GUID

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM