0

は、として定義されたデータモデルとシンプルなマイクロブログプラットフォームは、以下の考えてみましょう:EF6コードで最初にカスタム参照列名を設定するにはどうすればよいですか?

[Table("users")] 
public class User 
{ 
    [Column("id"), Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public long Id { get; set; } 

    [Column("name"), MaxLength(45), Index(IsUnique = true)] 
    public string Name { get; set; } 

    [Column("password"), MaxLength(45)] 
    public string Password { get; set; } 

    public virtual ICollection<Message> Messages { get; set; } 
} 


[Table("messages")] 
public class Message 
{ 
    [Column("id"), Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public long Id { get; set; } 

    [Column("text"), MaxLength(512)] 
    public string Text { get; set; } 

    [Column("author")] 
    public virtual User Author { get; set; } 
} 

私はそれデータベース(SQL DDL)最初の方法設計していた、私は外部キーとしてmessages.author参照users.id含まれています。私はこのように好きです:きちんと説明してください。

しかし、私が[Column("author")]属性を明示的に指定したにもかかわらず、コードの先頭の方法を試したところ、ではなく、外部キー列の名前がmessages.User_Idであることがわかりました。

この動作を修正する方法を教えてください。

私は、必要に応じて参照がより明白にするために、単純.user(代わりに私のオリジナル.authorのアイデアのを)という名前を付けすることに同意するものとし、確かではない.User_Idでしょう - _Idこの、明らかに冗長と醜いがキ​​ーに付加されますとき、私は完全にそれを嫌います列。

SQLiteCodeFirstライブラリでSQLiteデータベースを使用していますが、これが通常のEntity Frameworkの動作か、この特定のライブラリのバグかどうかはわかりません。

答えて

1

LocalDbを使用してコードをテストしたところ、同様の動作が発生しましたが、生成されたキーはUser_IDの代わりにAuthor_IDです。私はあなたの説明は、物事を試している間にコードの変更を反映するように更新されていないと仮定します。

Userへの参照を保持するためにMessageクラスに定義されているプロパティがないため、それ自体が生成されます(Author_ID)。あなた自身を追加して列の注釈をそれに移動すると、データベースは期待している名前を使用します。

だからあなたMessageクラスは次のようになります。

[Table("messages")] 
public class Message 
{ 
    [Column("id"), Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public long Id { get; set; } 

    [Column("text"), MaxLength(512)] 
    public string Text { get; set; } 

    [Column("author")] 
    public long AuthorId { get; set; } 

    public virtual User Author { get; set; } 
} 
関連する問題