2016-09-30 8 views
1

最近、Entity Frameworkを使用してSQLiteを使いこなしてきましたが、DBの最初のアプローチの後に生成されたエンティティのナビゲーションプロパティに関して何かがわかりません。そしてより具体的には、多対多の関係。SQLiteとEntity Framework 6を​​使用したときに間違ったナビゲーションプロパティ

注:ASP.NET Web Api OWINプロジェクトを使用します。

これは私がやったことです:

  1. 私は私が使用System.Data.SQLite

  2. の最新バージョンをインストールしEntity Frameworkの

  3. の最新バージョンをインストール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; } 

を。

どうすれば修正できますか?

答えて

1

Entity Frameworkが結合テーブルを省略できるのは、そのテーブルが多対多の関係で結合されているテーブルのキーのみで構成される場合のみです。このテーブルのId列が存在するため、新しいエンティティが生成されます。

これを回避する唯一の方法は、そのId列を削除し、その表にUserIdとLanguageIdのキーで構成される複合キーを作成することです。データベーススキーマを変更できない場合は、他に選択肢はありませんが、深呼吸して動作する方法を受け入れます。

EFは、多対多の関係の処理方法に関するいくつかの追加の読書:だからhttps://msdn.microsoft.com/en-us/library/dd742359.aspx

+0

は、あなたが言っていること「ブリッジ」テーブルには独自のidフィールドではなく、複合ID(ユーザーIDを持っていない場合、それは私に生成されたエンティティの正しいナビゲーションプロパティを保証するでしょうか? – user2128702

+1

はい、正確です。これは、Entity Frameworkがコードを最初のワークフローで作成した方法です。 – PMV

関連する問題