В последнее время я играл с SQLite с использованием Entity Framework, но мне не очень понятно, что касается свойств навигации сгенерированных объектов после первого подхода DB. И, более конкретно, отношения «многие ко многим».Неправильные свойства навигации при использовании SQLite и Entity Framework 6
Примечание. Использование проекта ASP.NET Web Api OWIN.
Это то, что я сделал:
Я установил последнюю версию Entity Framework
Я установил последнюю версию System.Data.SQLite
Я 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; }
внутри пользователя лица.
Как это исправить?
Итак, вы говорите, что если «мост» таблица не имеет свое собственное поле идентификатора, а скорее композитный идентификатор (USERID, LanguageId), это обеспечило бы мне правильные свойства навигации в сгенерированных объектах? – user2128702
Да, точно. Это, BTW, заключается в том, как Entity Framework создала бы таблицу в первом рабочем процессе кода. – PMV