2016-09-08 5 views
0

以外のインターフェイスを実装するすべての種類の特定のプロパティの設定を持っている「IdEventReport」:は、私はプロパティを公開インターフェース「IEventReportElement」から継承するタイプの数を、持っている1

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

これは、私はいつも正しく記入することができないのですが、データベースでnullableでない必要があります。

私はDbContextの私OnModelCreatingメソッドにライン

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

を追加した理由厥。

しかし、タイプ '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データアノテーションを使用して、プロパティがモデルから明示的に除外されていないことを確認します。それが有効なプリミティブプロパティであることを確認してください。

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

+0

私はあなたがクエリで 'Position.IdEventReport'を選択しようとしたと思います。これは正しいですか? –

+0

いいえ、IdEventReportをモデルに含めるべきではありません。 IEventReportElementには、私が使用したい他の重要なプロパティがあります。データベース内でこのプロパティを使用したくないだけです。 – DevilSuichiro

答えて

0

私は解決策を見つけましたが、それほど素晴らしいものではありません。私は型設定の行を

に変更しました。
modelBuilder.Types<IEventReportElement>().Where(x=>x.Name!="Position").Configure(x=>x.Property(y=>y.IdEventReport).IsRequired()); 
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"); 

サイドノート:なぜ使いたくないインターフェイスを実装していますか?たぶんあなたは小さな部分でインターフェイスを分割し、あなたが使用しようとしているものだけを実装することができます。

+0

これはIdParentプロパティでテーブルをクエリしたいので、これが私の望むものではありません。このアプローチでは不可能です。 – DevilSuichiro

関連する問題