0

这是这个问题的扩展,据我所知,它现在在 EF6 中有效。但是,当您拥有同时具有共享和非共享属性的子类时,似乎存在问题。

假设这是我的模型设置:

public abstract class Document
{
    public int Id { get; set; }
    public string NameOnDocument { get; set; }
}

public class BirthCertificate : Document
{
    public string RegistrationNumber { get; set; }
}

public class Licence : Document
{
    public string LicenceNumber { get; set; }
}

在数据库中,我想BirthCertificate.RegistrationNumberLicence.LicenceNumber共享同一列,Number. 因此,我正在像这样设置我的模型:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    // Document - base class
    modelBuilder.Entity<Document>().HasKey(d => d.Id);
    modelBuilder.Entity<Document>()
        .Property(d => d.Id)
        .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
    modelBuilder.Entity<Document>()
        .Property(d => d.NameOnDocument)
        .HasColumnName("Name");

    // Birth certificate
    modelBuilder.Entity<Document>().Map<BirthCertificate>(map => 
        map.Property(c => c.RegistrationNumber).HasColumnName("Number"));

    // Licence
    modelBuilder.Entity<Document>().Map<Licence>(map => 
        map.Property(l => l.LicenceNumber).HasColumnName("Number"));
}

当我生成数据库时,它看起来和工作正常:

数据库模型

现在讨论手头的问题。假设Licence实体还需要记录到期日;所以我添加如下:

public class Licence : Document
{
    public string LicenceNumber { get; set; }
    public DateTime ExpiryDate { get; set; }
}

现在,当我重新生成数据库时,它看起来像这样:

在此处输入图像描述

更重要的是,如果我尝试插入许可证和出生证明,我会得到以下异常:

EntityFramework.dll 中出现“System.Data.Entity.Infrastructure.DbUpdateException”类型的未处理异常

附加信息:跨实体或关联共享的值在多个位置生成。检查映射是否不会将 EntityKey 拆分为多个存储生成的列。

我可以理解为什么会引发该异常-因为数据库没用。

我错过了什么?

4

2 回答 2

0

好的,事实证明这个问题很容易解决,但据我所知,在任何地方都没有记录。所以希望这会帮助有同样问题的人。

看起来,关键是您必须映射派生实体上的每个属性:

modelBuilder.Entity<Document>().Map<Licence>(map =>
{
    map.Property(l => l.LicenceNumber).HasColumnName("Number");
    map.Property(l => l.ExpiryDate).HasColumnName("ExpiryDate");
});

现在我的数据库按照我的预期生成,一切正常。

于 2014-11-13T04:17:50.547 回答
0

我不确定通过将 2 列放入数据库中的 1 中您是否获得了很多。我认为您不会节省太多空间,并且您无法询问Numberbase Document,即使两个文档都有一个。您是否考虑过将Number字段添加到基础并在覆盖上使用数据注释 - 像这样?

public abstract class Document
{
    public int Id { get; set; }
    public string NameOnDocument { get; set; }
    public virtual string Number
}

public class BirthCertificate : Document
{
    [Display(Name="Registration Number"]
    [Required]
    public override string Number { get; set; }
}

public class Licence : Document
{
    [Display(Name="Licence Number"]
    [Required]
    public override string Number { get; set; }
}

编辑如果所有文件都没有编号:

public abstract class Document
{
    public int Id { get; set; }
    public string NameOnDocument { get; set; }
}

public abstract class NumberedDocument : Document
{
    public virtual string Number
}

public class BirthCertificate : NumberedDocument
{
    [Display(Name="Registration Number"]
    [Required]
    public override string Number { get; set; }
}
于 2014-11-13T10:56:46.347 回答