Как сопоставить отношения 1 к 0 или 1 в Fluent API в EF 6 - PullRequest
0 голосов
/ 03 июня 2019

Отредактировано

У меня есть 2 таблицы: медсестра и человек.Человек имеет отношение 1 к 0 или 1 к медсестре.Другими словами, некоторые лица в моем заявлении также будут медсестрами.Я хотел бы использовать один и тот же первичный ключ в обеих таблицах.Когда я выполняю код, запрашивающий таблицу Nurse, я получаю «System.Data.Entity.Core.EntityCommandExecutionException», а затем на внутреннем исключении: «SqlException: недопустимое имя столбца« Person_Id »."

Моя модель медсестры не имеет поля Person_Id.Сгенерированный запрос, кажется, добавил его.Я должен что-то упустить в определении модели, так как удаление "public virtual Person Person {get; set;}" заставляет запрос генерироваться правильно.EF, кажется, зацикливается на том факте, что PK - это Id в таблице Person, но NurseId в таблице Nurse.

Я нашел несколько мест в Интернете, где показано, как отобразить это с помощью Fluent API, но ничего не соответствует моему случаю.Поскольку большинство людей в моем приложении не являются медсестрами, я не хочу ссылаться на модель медсестры в моей модели персон, которая убирает решение, которое я продолжаю видеть онлайн:

//won't work because I am trying to no have a reference to Nurse in my Person model.  So i.Nurse below doesn't exist
modelBuilder.Entity<Nurse>().HasRequired(i => i.Person).WithOptional(i => i.Nurse) 

Запрос EF генерирует:

{SELECT 
1 AS [C1], 
[Extent1].[NurseId] AS [NurseId], 
[Extent1].[CredentialId] AS [CredentialId], 
[Extent1].[DisciplineId] AS [DisciplineId], 
[Extent1].[UnitId] AS [UnitId], 
[Extent1].[YearsOfService] AS [YearsOfService], 
[Extent1].[Person_Id] AS [Person_Id]
FROM [dbo].[Nurse] AS [Extent1]}

Вот таблицы:

CREATE TABLE [dbo].[Person]
(
    [Id] BIGINT IDENTITY (1, 1) NOT NULL,
    CONSTRAINT [PK__Person] PRIMARY KEY CLUSTERED ([Id] ASC)
)

CREATE TABLE [dbo].[Nurse]
(
    [NurseId] BIGINT NOT NULL, 
    CONSTRAINT [PK_Nurse] PRIMARY KEY ([NurseId]),
    CONSTRAINT [FK_Nurse_Person] FOREIGN KEY ([PersonId]) REFERENCES [dbo].[Person] ([Id])
)

И сущности:

public class Person 
{
    [Key]
    public long Id { get; set; }
}

public class Nurse
{
    [Key]
    public long NurseId { get; set; }

    public long? CredentialId { get; set; }

    public long? DisciplineId { get; set; }

    public long? UnitId { get; set; }

    public int? YearsOfService { get; set; }

    [ForeignKey("PersonId")]
    public virtual Person Person { get; set; }

    [ForeignKey("CredentialId")]
    public virtual Credential Credential { get; set; }

    [ForeignKey("DisciplineId")]
    public virtual Discipline Discipline { get; set; }

    [ForeignKey("UnitId")]
    public virtual Unit Unit { get; set; }
}

ПриложениеDBContext:

public class ApplicationDBContext : DbContext
{
    public ApplicationDBContext() : base("ApplicationDbContext")
    {

    }

    public DbSet<Nurse> Nurses { get; set; }
    public DbSet<Person> People { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
       modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
       modelBuilder.Entity<Nurse>().HasKey(n => n.NurseId);
    }
}

ЭтоМожно ли это сделать, или мне нужно сослаться на «Медсестру» в моей таблице «Персона» и перейти к тому, что я видел в Интернете?

Ответы [ 2 ]

0 голосов
/ 17 июня 2019

Для тех, кто наткнулся на это.Я нашел ответ здесь .Беглый API, который я разместил, был близок, он должен был быть:

modelBuilder.Entity<Nurse>().HasRequired(n => n.Person).WithOptional();
0 голосов
/ 03 июня 2019

Я думаю, что ваша проблема в том, что вы используете PersonId, у которого есть первичный ключ в Nurse.Попробуйте дать медсестре свой собственный идентификатор.Для каждой таблицы полезно иметь собственные идентификаторы.EF имеет проблемы с таблицами или представлениями, которые не имеют уникального первичного ключа.

    CREATE TABLE [dbo].[Person]
(
    [Id] BIGINT IDENTITY (1, 1) NOT NULL,
    CONSTRAINT [PK__Person] PRIMARY KEY CLUSTERED ([Id] ASC)
)

CREATE TABLE [dbo].[Nurse]
(
    [Id] BIGINT IDENTITY (1, 1) NOT NULL,
    [PersonId] BIGINT unique NOT NULL,  
    CONSTRAINT [PK_Nurse] PRIMARY KEY ([Id]),
    CONSTRAINT [FK_Nurse_Person] FOREIGN KEY ([PersonId]) REFERENCES [dbo].[Person] ([Id])
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...