1

私は基本クラスの 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 を列 'Discriminator' に挿入できません

この状況で何が間違っていますか?なぜEFはディスクリミネーターフィールドに「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
4

1 に答える 1

4

デフォルトの継承マッピングは、派生クラスが 1 つしか存在しない場合、識別子列を定義しません。Person から派生する 2 番目のクラスを定義すると、コードが機能します。

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 に答える