1

我有一个基类人:

[KnownType(typeof(Doctor))]
public abstract class Person
{
    public int PersonId { get; set; }

    public string FirstName { get; set; }

    public string MiddleName { get; set; }

    public string LastName { get; set; }

    public string Gender { get; set; }

    public DateTime BirthDate { get; set; }

    public string Email { get; set; }

    public string MobilePhoneNumber { get; set; }

    public string HomePhoneNumber { get; set; }

    public bool IsGlobal { get; set; }

    public bool IsDeleted { get; set; }

    public bool IsApproved { get; set; }

    public int? FacilityId { get; set; }

    public int? AddressId { get; set; }

    public virtual FacilityView Facility { get; set; }

    public virtual Address Address { get; set; }

    public virtual ICollection<Organization> Organizations { get; set; }

    public virtual ICollection<TenantEntity> TenantEntities { get; set; }
}

并有嵌套类Doctor:

public class Doctor : Person
{
    public string Speciality { get; set; }
}

表人脚本

CREATE TABLE [core].[Person](
[PersonId] [int] IDENTITY(1,1) NOT NULL,
[Discriminator] [nvarchar](255) NOT NULL,
[FirstName] [nvarchar](255) NOT NULL,
[MiddleName] [nvarchar](255) NULL,
[LastName] [nvarchar](20) NOT NULL,
[Gender] [nvarchar](20) NOT NULL,
[BirthDate] [date] NOT NULL,
[Email] [nvarchar](250) NULL,
[MobilePhoneNumber] [nvarchar](250) NULL,
[HomePhoneNumber] [nvarchar](250) NULL,
[IsGlobal] [bit] NOT NULL,
[IsDeleted] [bit] NOT NULL,
[IsApproved] [bit] NOT NULL,
[FacilityId] [int] NULL,
[AddressId] [int] NULL,
[Speciality] [nvarchar](250) NULL,

当我尝试保存新的 Doctor 实体时出现错误:

无法将值 NULL 插入“鉴别器”列

在这种情况下我做错了什么?为什么 EF 不在鉴别器字段中保存“医生”值?

更新:

来自 DBContext 的一部分:

public DbSet<Person> Persons { get; set; }
#region Person

        modelBuilder.Entity<Person>()
            .ToTable("Person", "core")
            .HasKey(t => t.PersonId);

        modelBuilder.Entity<Person>()
            .HasOptional(t => t.Facility);

        modelBuilder.Entity<Person>()
            .HasOptional(t => t.Address);

        modelBuilder.Entity<Person>()
            .HasMany(x => x.Organizations)
            .WithMany()
            .Map(x =>
            {
                x.MapLeftKey("PersonId");
                x.MapRightKey("OrganizationId");
                x.ToTable("PersonOrganization", "core");
            });

        modelBuilder.Entity<Person>()
            .HasMany(x => x.TenantEntities)
            .WithMany()
            .Map(x =>
            {
                x.MapLeftKey("PersonId");
                x.MapRightKey("TenantEntityId");
                x.ToTable("PersonTenantEntity", "core");
            });

        #endregion
4

1 回答 1

4

如果仅存在一个派生类,则默认继承映射不​​定义鉴别器列。如果您定义派生自 Person 的第二个类,您的代码将起作用:

public class Nurse : Person
{ 
    public string Whatever {get;set;}
}

或者将鉴别器显式添加到您的模型中。

modelBuilder.Entity<Doctor>().Map(p => p.Requires("Discriminator").HasValue("Doctor"));
于 2014-06-23T20:27:11.383 回答