【问题标题】:Not set "Discriminator" column when save entity in Entity Framework在实体框架中保存实体时未设置“鉴别器”列
【发布时间】:2014-06-23 10:57:11
【问题描述】:

我有一个基类 Person:

[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 不在 Discriminator 字段中保存“Doctor”值?

更新:

部分来自 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

【问题讨论】:

  • 能否请您发布您的 DbContext 课程。

标签: sql sql-server entity-framework ef-code-first discriminator


【解决方案1】:

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

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

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

modelBuilder.Entity<Doctor>().Map(p => p.Requires("Discriminator").HasValue("Doctor"));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-04
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多