2

Entity Framework CodeFirstモデルを作成してHelloWorldと同等の処理を実行しました(他のC#プログラムを作成しましたが、Entity Frameworkは使用していません)。私は次のようなモデルを作成しました:

class Preferences
{
    [Key]
    public string StationName { get; set; }
    [MaxLength(30)]
    public string MainDatabase { get; set; }
    [MaxLength(30)]
    public string DefaultSequence { get; set; }
}

その後、レコードを追加するための小さなルーチンがありました

var newPrefs = new Preferences
{
    StationName = "MATT",
    DefaultSequence = "NONE",
    MainDatabase = "NONE"
};
Preferences prefs = foo.Preferences.Add(newPrefs);

次に、データベースを作成しようとしますが、主キーを追加するとエラーが発生して失敗します

"BLOB/TEXT column 'StationName' used in key specification without a key length"

CHARまたはVARCHARの代わりにデータ型「mediumtext」を使用し、MySQLはその型をキーに使用できないためです。

キー列に優先タイプを使用するようにMySQLに指示する、データベースにとらわれない方法はありますか?それとも、あきらめて整数キーを作成する必要がありますか?

このようなデザインのバリエーションも試してみましたが、うまくいきませんでした。

class Preferences
{
    [Key,DataType("CHAR"),StringLength(30)]
    public string StationName { get; set; }
    [MaxLength(30)]
    public string MainDatabase { get; set; }
    [MaxLength(30)]
    public string DefaultSequence { get; set; }
}

ご協力いただきありがとうございます。

4

2 に答える 2

5

流暢なマッピング列タイプを試してみてください。

modelBuilder.Entity<Preferences>()
    .Property(p => p.Id)
    .HasColumnType("CHAR(30)");

これは同等だと思いますが[Column(TypeName = "CHAR(30)")]、同じかどうかは定かではありません。

編集: Mattのテストによると、長さは個別であり、「char」は大文字と小文字を区別する場合があります(MySQLやその他のエンジンには、識別子の大文字と小文字の区別に関連する設定が多数あり、OSが役割を果たす場合があるため、異なる場合があります) :[Column(TypeName="char")][MaxLength(30)]

于 2013-03-21T21:06:35.443 に答える
2

リレーショナルデータベースの設計で一般的に受け入れられている方法を適用することをお勧めします。これは、意味のない主キーを持つことです。つまり、ビジネスドメインには意味がありません。

class Preferences
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]  
    public int Id { get; set; }

    [MaxLength(30)]
    public string StationName { get; set; }
    [MaxLength(30)]
    public string MainDatabase { get; set; }
    [MaxLength(30)]
    public string DefaultSequence { get; set; }
}

追加の利点:必要に応じていつでもStationNameを自由に変更できるようになりました。

于 2013-03-21T20:47:08.593 に答える