0

プロパティ「IdEventReport」を公開するインターフェイス「IEventReportElement」から継承する多くのタイプがあります。

public interface IEventReportElement
{
    long Id { get; set; }
    long? IdEventReport { get; set; }
}

これは、常にすぐに適切に入力できるとは限らないため、null 許容プロパティですが、データベースでは null 許容であってはなりません。

そのため、行を追加しました

modelBuilder.Types<IEventReportElement>().Configure(x=>x.Property(y=>y.IdEventReport).IsRequired());

DbContext の OnModelCreating メソッドに。

ただし、タイプ 'Position' はこのインターフェイスを実装する必要がありますが、データベースにプロパティ 'IdEventReport' の列を持つべきではなく、代わりにそれが公開するプロパティ 'IdParent' の列を持つ必要があります。

public class Position : BOBase, IEventReportElement
{
    public long? IdEventReport 
    {
        get { return IdParent; }
        set { IdParent = value; }
    }

    public long? IdParent { get; set; }
}

および modelBuilder のセクション

        modelBuilder.Entity<Position>().Property(x => x.IdParent).IsRequired();
        modelBuilder.Entity<Position>().Ignore(x => x.IdEventReport);

ただし、データベースを作成しようとすると、すでに例外がスローされます。

System.InvalidOperationException: プロパティ 'IdEventReport' は、タイプ 'Position' で宣言されたプロパティではありません。Ignore メソッドまたは NotMappedAttribute データ注釈を使用して、プロパティがモデルから明示的に除外されていないことを確認します。有効なプリミティブ プロパティであることを確認してください。

これは有効かもしれませんが、特定のタイプの指定された Type 構成をオーバーライドすることはできませんか? このインターフェイスを実装する他のすべての型に行 .IsRequired() を追加する必要がありますか、またはこれを克服する別の方法はありますか?

4

2 に答える 2

0

私は解決策を見つけましたが、それほど良いものではありません。タイプ構成の行を次のように変更することでそれを行いました

modelBuilder.Types<IEventReportElement>().Where(x=>x.Name!="Position").Configure(x=>x.Property(y=>y.IdEventReport).IsRequired());
于 2016-09-08T08:09:48.507 に答える
0

データベースで列に別の名前を付けたい場合は、 を使用しますHasColumnName

C# モデルで IdParent にアクセスするには[NotMapped]、DB の作成時にこのプロパティを無視するように EF に指示するために使用します。

public class Position : BOBase, IEventReportElement {
    public long? IdEventReport {get; set; }

    [NotMapped]
    public long? IdParent {
        get { return IdEventReport ; }
        set { IdEventReport = value; }
    } 
}

modelBuilder.Entity<Position>().Property(x => x.IdEventReport).HasColumnName("IdParent");

補足として、使用したくないインターフェースを実装するのはなぜですか? おそらく、インターフェースを小さな部分に分割して、使用するものだけを実装することができます。

于 2016-09-08T08:08:21.717 に答える