6

因此,我尝试将 Code First 与 Fluent 一起使用来映射具有一种派生类型的基类,其中表架构是按类型排列的表。此外,派生类型与也具有复合外键的另一种类型具有多对一关系。(这些表上的键是不可更改的,并且名称完全匹配。)

这是我在 CSharp 中尝试实现的示例:

public class BaseType
{
    public int Id;
    public int TenantId;
    public int Name;
}

public class DerivedType : BaseType
{
    public int Active;
    public int OtherTypeId;
    public OtherType NavigationProperty; 
}

这是配置类中的配置:

public BaseTypeConfiguration()
{
     ToTable("BaseTypes", "dbo");

     HasKey(f => new { f.Id, f.TenantId});

     Property(f => f.Id)
         .HasColumnName("BaseTypeId")
         .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
}

public DerivedTypeConfiguration()
{
    ToTable("DerivedTypes", "dbo");

    //OtherType has many DerivedTypes
    HasRequired(dt=> dt.OtherTypeNavigation)
        .WithMany(ot=> ot.DerivedTypes)
        .HasForeignKey(dt=> new { dt.OtherTypeId, dt.TenantId});
}

据我所知,我的映射设置正确(例如,我遵循了许多具有这种确切情况但只有一个列标识符的教程和示例)

当我尝试查询这些实体时,我得到的异常是: The foreign key component 'TenantId' is not a declared property on type 'DerivedType'.

当我尝试使用new关键字在类型上显式声明这些属性时,我得到一个异常,说存在重复的属性。

来自 EF 团队的答复

这是 EF 不支持在基类型中定义属性然后将其用作派生类型中的外键的更基本限制的一部分。不幸的是,这是一个很难从我们的代码库中移除的限制。鉴于我们没有看到很多对此的请求,因此我们不打算在现阶段解决此问题,因此我们将关闭此问题。

4

2 回答 2

1

我认为这就是你要找的:

[Table("BaseType")]
public class BaseType
{
    [Key, DatabaseGenerated(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity)]
    public int Id {get;set;}
    [Key]
    public int TenantId { get; set; }
    public int Name { get; set; }
}

[Table("Derived1")]
public class DerivedType : BaseType
{
    public int Active { get; set; }
    public int OtherTypeId { get; set; }
    public virtual OtherType NavigationProperty {get;set;}
}

[ComplexType]
public class OtherType
{
    public string MyProperty { get; set; }

}


public class EFCodeFirstContext : DbContext
{
    public DbSet<BaseType> BaseTypes { get; set; }
    public DbSet<DerivedType> DerivedTypes { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<BaseType>().HasKey(p => new { p.Id, p.TenantId });
        base.OnModelCreating(modelBuilder);
    }
}

上面的代码导致:

于 2012-12-22T11:03:25.500 回答
0

根据他们的支持,目前尚不支持。我在这里为类似的堆栈问题创建了一个案例,作者更新了案例结果。

https://stackoverflow.com/a/14880084/1791547

于 2017-10-23T19:17:12.550 回答