最近、Entity Frameworkを使用してSQLiteを使いこなしてきましたが、DBの最初のアプローチの後に生成されたエンティティのナビゲーションプロパティに関して何かがわかりません。そしてより具体的には、多対多の関係。SQLiteとEntity Framework 6を使用したときに間違ったナビゲーションプロパティ
注:ASP.NET Web Api OWINプロジェクトを使用します。
これは私がやったことです:
私は私が使用System.Data.SQLite
の最新バージョンをインストールしEntity Frameworkの
の最新バージョンをインストールFirefoxアドオンを使用してデータベースを作成する、私が作成するために、Visual Studioの2015を使用その後
CREATE TABLE "Users" ( "Id" INTEGER PRIMARY KEY NOT NULL UNIQUE , "IdSrvId" INTEGER NOT NULL UNIQUE , "FirstName" VARCHAR NOT NULL , "LastName" VARCHAR NOT NULL , "Email" VARCHAR NOT NULL , "About" VARCHAR NOT NULL , "GenderId" INTEGER NOT NULL UNIQUE , "BirthDate" DATETIME, "PhoneNumber" VARCHAR ) CREATE TABLE "UserLanguаges" ( "Id" INTEGER PRIMARY KEY NOT NULL UNIQUE , "UserId" INTEGER NULL REFERENCES Users(Id), "LanguageId" INTEGER NULL REFERENCES Languаges(Id) ) CREATE TABLE "Langugaes" ( "Id" INTEGER PRIMARY KEY NOT NULL UNIQUE , "Name" VARCHAR NOT NULL UNIQUE )
:それは私の多対多のDB定義DBを作成する際の一つのために私の* .sqlite
例を生成しましたそのデータモデル* .sqliteファイル。このチュートリアルの後:SQLite EntityFramework 6 Tutorial
世代の後、私はこのように見ている実体としての私のテーブルのすべてを得た:
public partial class User
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public User()
{
this.GroupUsers = new HashSet<GroupUser>();
this.UserLanguаges = new HashSet<UserLanguаges>();
}
public long Id { get; set; }
public long IdSrvId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public string About { get; set; }
public long GenderId { get; set; }
public Nullable<System.DateTime> BirthDate { get; set; }
public string PhoneNumber { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<UserLanguаges> UserLanguаges { get; set; }
}
public partial class Languаges
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public Languаges()
{
this.UserLanguаges = new HashSet<UserLanguаges>();
}
public long Id { get; set; }
public string Name { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<UserLanguаges> UserLanguаges { get; set; }
}
public partial class UserLanguаges
{
public long Id { get; set; }
public Nullable<long> UserId { get; set; }
public Nullable<long> LanguageId { get; set; }
public virtual Languаges Languаges { get; set; }
public virtual User User { get; set; }
}
ここで私を心配何、ユーザーと言語エンティティ内のナビゲーションプロパティがあります。ご覧のように、多対多の関係に役立つ「ブリッジ」テーブルへの参照を作成しますが、期待したとおりに直接他のエンティティへは参照しません。
私はこの予想:ユーザーエンティティの内部
public virtual ICollection<Languаge> Languаges { get; set; }
:このように見えるように
public virtual ICollection<UserLanguаges> UserLanguаges { get; set; }
を。
どうすれば修正できますか?
は、あなたが言っていること「ブリッジ」テーブルには独自のidフィールドではなく、複合ID(ユーザーIDを持っていない場合、それは私に生成されたエンティティの正しいナビゲーションプロパティを保証するでしょうか? – user2128702
はい、正確です。これは、Entity Frameworkがコードを最初のワークフローで作成した方法です。 – PMV