6

そのため、FluentでCode Firstを使用して、テーブルスキーマがTable-per-Type配置である1つの派生型で基本クラスをマップしようとしています。また、派生型は、複合外部キーを持つ別の型と多対1の関係にあります。(これらのテーブルのキーは変更できず、名前は完全に一致します。)

これが私が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 に答える