2017-08-17 2 views
1

abstract class BaseEntityに無視する必要がありますが、[NotMappedAttribute]を使用せずにこの機能を使用することはできませんが、属性を使用すると無視されますOData APIで使用します。Entity Framework 6:すべての派生型のbasetypeプロパティを無視する

私はここでこれをテストするためにgithubのプロジェクトを設定している: https://github.com/nurf3d/EntityFrameworkDerivedTypesIgnoreProperiesTest/tree/master

継承チェーン:

[NotMappedAttribute]を使用して、State properyがために無視されます:

public abstract class BaseEntity 
{ 
    [Key] 
    public int ID { get; set; } 

    [Timestamp] 
    public byte[] Rowversion { get; set; } 

    public State State { get; set; } 
} 

[Table("Events")] 
public abstract class Event : BaseEntity 
{ 
    public int PersonID { get; set; } 

    public string EventName { get; set; } 

    public virtual Person Person { get; set; } 
} 

public class DerivedEvent1 : Event 
{ 
    public bool IsDerivedEvent1 { get; set; } 
} 

public class DerivedEvent2 : Event 
{ 
    public bool IsDerivedEvent2 { get; set; } 
} 

属性すべての型が正しく、移行は正常に実行されますが、これにより不要なOData APIからプロパティも削除されます。

OData API内でStateプロパティが必要なため、[NotMappedAttribute]ではなく、流暢な設定を使用しています。

流暢な構成:このエラーで

modelBuilder.Types<BaseEntity>().Configure(clazz => clazz.Ignore(prop => prop.State)); 

add-migration Initial -Force 

結果:

You cannot use Ignore method on the property 'State' on type 'EntityFrameworkIgnoreProperty.Models.DerivedEvent1' because this type inherits from the type 'EntityFrameworkIgnoreProperty.Models.BaseEntity' where this property is mapped. To exclude this property from your model, use NotMappedAttribute or Ignore method on the base type.

私はこれが流暢APIで動作するように取得する必要があると私はでBaseEntityのすべての派生型のためにこれを実行する必要があります一度。

私の実際のプロジェクトでは、100以上のエンティティがあります。これは、個々のエンティティごとに手作業で行うことはできません。

+0

は(すなわち、EFの継承に参加)のエンティティとしてマッピングされた 'BaseEntity'クラスですか? –

+0

'BaseEntity'は、別個のエンティティとしてマッピングされていません。この例では、イベントのみをTPHを持つエンティティとしてマップする必要があります。 – Nurfed

答えて

2

この問題は、メソッドボディが直接または間接的に継承される各クラスに対して呼び出され、EF継承に問題を引き起こしているという事実にあるようです。あなたは何ができるか

にのみ、このような直接的な派生型の設定を適用するフィルタを使用することです:

modelBuilder.Types<BaseEntity>() 
    .Where(t => t.BaseType == typeof(BaseEntity)) 
    .Configure(clazz => clazz.Ignore(prop => prop.State)); 
+0

トリックをしてくれてありがとう!私はすでにこれを持っていたことを知っていますが、私はそれを持っていた問題を覚えていません。とにかく...これは私のすべての問題を解決するようです! – Nurfed

関連する問題