0

明らかな何かが欠けていると確信していますが、次のコードを正しく機能させることができないようです。

これは、Guidを使用する私のPOCOクラスの1つです。

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

ここで起こっていると思うのは、Entity FrameworkがPlayerID列をGUID(MySqlのUUID)として作成し、AUTO_INCREMENTそれに属性を適用することです。

http://docs.oracle.com/cd/E17952_01/refman-5.5-en/numeric-type-attributes.htmlからAUTO_INCREMENT、整数列に対してのみ有効であるように思われるため、このエラーが発生する可能性があります。

ここで試すことは、Guidからintに変更することだと思いPlayerIDます。これにより、少なくともエラーの原因を絞り込むことができます。

編集1

モデルフィールドをDataColumnオブジェクトとして変換および変更し、最初にコードを使用して整数主キーのIDを無効にする(自動インクリメント)から、次のコマンドで自動インクリメントをオフにできるはずです。

HasKey(p => p.PlayerID)
Property(p => p.PlayerID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None)

編集2

少なくともSQLServerでは、を使用Property(p => p.PlayerID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None)すると、新しい行が作成されたときに空のGuidが挿入されます(ただし、他の場所ではこのように動作すると想定するのが妥当と思われます)。私が見ることができる唯一の賢明な回避策はPlayerIDPlayerコンストラクターにデータを入力することです。

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