0

我确定我只是遗漏了一些明显的东西,但我似乎无法让以下代码正常运行。

这是我使用 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'的列说明符不正确

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

4

1 回答 1

1

我认为这里发生的是实体框架将PlayerID列创建为 GUID(MySql 中的 UUID),然后将AUTO_INCREMENT属性应用于它。

http://docs.oracle.com/cd/E17952_01/refman-5.5-en/numeric-type-attributes.html看来,这似乎AUTO_INCREMENT只对整数列有效,这可能就是您收到此错误的原因。

我认为在这里尝试的是将PlayerIDGuid 更改为 int - 这至少应该缩小错误的原因。

编辑 1

Convert and modify a model field as an DataColumn object and 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 上, usingProperty(p => p.PlayerID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None)将导致在创建新行时插入一个空的 Guid(尽管假设它在其他地方会以这种方式表现似乎是合理的)。我能看到的唯一明智的解决方法是PlayerIDPlayer构造函数中填充:

public Player()
{
    this.PlayerID = Guid.NewGuid();
}
于 2012-11-01T00:20:47.997 回答