2016-09-30 5 views
1

В последнее время я играл с SQLite с использованием Entity Framework, но мне не очень понятно, что касается свойств навигации сгенерированных объектов после первого подхода DB. И, более конкретно, отношения «многие ко многим».Неправильные свойства навигации при использовании SQLite и Entity Framework 6

Примечание. Использование проекта ASP.NET Web Api OWIN.

Это то, что я сделал:

  1. Я установил последнюю версию Entity Framework

  2. Я установил последнюю версию System.Data.SQLite

  3. Я Firefox для создания моей базы данных. Это порождало мой * .sqlite

Пример одного из моих многих ко многим БД определений при создании БД:

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 
) 

После этого я использовал Visual Studio 2015 для создания Модель данных с использованием этого * .sqlite file. После этого учебника: 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<UserLanguаges> UserLanguаges { get; set; } 

выглядеть следующим образом:

public virtual ICollection<Languаge> Languаges { get; set; } 

внутри пользователя лица.

Как это исправить?

ответ

1

Единственный раз, когда Entity Framework может опустить таблицу соединений, состоит в том, что эта таблица состоит только из ключей таблиц, соединенных между собой многими отношениями. Это столбец «Идентификатор» в этой таблице, который вызывает его создание нового объекта.

Единственный способ избежать этого столбца идентификатора и сделать эту таблицу составной, состоящей из ключей UserId и LanguageId. Если вы не можете изменить схему базы данных, нет другого выбора, но сделайте глубокий вдох и примите, как это работает.

Некоторые дополнительные чтение о том, как EF обрабатывает многие-ко-многим: https://msdn.microsoft.com/en-us/library/dd742359.aspx

+0

Итак, вы говорите, что если «мост» таблица не имеет свое собственное поле идентификатора, а скорее композитный идентификатор (USERID, LanguageId), это обеспечило бы мне правильные свойства навигации в сгенерированных объектах? – user2128702

+1

Да, точно. Это, BTW, заключается в том, как Entity Framework создала бы таблицу в первом рабочем процессе кода. – PMV

Смежные вопросы