2017-12-27 8 views
0

FluentマッピングでEntity Frameworkを使用しています。Fluentマッピングを使用しているときに、Entity Typeにキー定義エラーがありません。Entity Framework

私のアプリケーションでは、キーを持っていないビューからデータをフェッチしたいと思っています。

私はメソッドをテストしようとしたとき、私はエラーを取得流暢APIのエンティティのマッピングやビュー

からデータをフェッチする方法を書かれている:

Entity Type has no key defined, Define a key for this entity type

私はからデータをフェッチすることができます流暢にEntity Frameworkを使用してキーを表示します。以下 は、エンティティ・クラスがこれは私がビューを変更することはできません

public class WeatherDataMap : EntityTypeConfiguration<WeatherData> 
{ 
    public WeatherDataMap() : base() 
    { 
     this.ToTable("dbo.vw_WeatherData"); 
    } 
} 

マッピングクラスである

public class WeatherData : BaseModel 
{ 
    public DateTime ReportDateTime { get; set; } 
    public string VendorName { get; set; } 
    public string WeatherTypeCd { get; set; } 
    public string WeatherStationCd { get; set; } 
    public DateTime WeatherDate { get; set; } 
    public int Interval { get; set; } 
    public string IntervalTypeCd { get; set; } 
    public string WeatherValueTypeCd { get; set; } 
    public decimal ValueMax { get; set; } 
    public decimal ValueMin { get; set; } 
    public decimal ValueAvg { get; set; } 
    public string Unit { get; set; } 
    public int DegreeDayBase { get; set; } 
    public string UpdateUser { get; set; } 
    public DateTime UpdateDt { get; set; } 
    public int VendorId { get; set; } 
    public int WeatherStationId { get; set; } 
    public int WeatherTypeId { get; set; } 
    public int IntervalTypeId { get; set; } 
    public int WeatherValueTypeId { get; set; } 
} 

ですが、私は唯一の権限を読みました。

+1

*このエンティティタイプのキーを定義してください。*かなり明確ですね。あなたのコードを投稿するのにもっと助けが必要な場合。 –

+0

コードがないのでこれを閉じるための投票。 – DavidG

+0

EFの表とビューの間に違いはありませんが、あなたは '[Key]'で一意の小道具を飾ることができます。とにかく可能です。https://stackoverflow.com/questions/20203492/entitytype-has-no-key-defined-エラー – Aria

答えて

1

テーブルやビューにプライマリキーがなくても、モデルにはPKが必要であることを避けるために問題はありません。EF-Code FirstのドキュメントでKey a PKを複数の列に定義できるあなたは重要なパラメータのために、この注文を取る必要がありますDbSetFind方法を使用するには

public partial class WeatherData : BaseModel 
{ 
    [Key] 
    [Column(Order = 0)] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int VendorId { get; set; } 

    [Key] 
    [Column(Order = 1)] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int WeatherStationId { get; set; } 

    [Key] 
    [Column(Order = 2)] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int IntervalTypeId { get; set; } 

    [StringLength(50)] 
    public string VendorName { get; set; } 

    [StringLength(50)] 
    public string WeatherTypeCd { get; set; } 
} 

:または1列にので、あなたのモデルは次のようになります。

ただし、上記のモデルで見られるように、すべてのint列をプライマリキーとして定義しますが、EFでウィザードを使用してEFコードの最初のモデルを生成する場合は注意してください。ただし、キーとして定義した重複フィールドがない場合は、複数の列を主キーとして結合する必要があります。

他の方法は、コンテキストのOnModelCreatingに以下のコードとしてキーを定義することです。

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<WeatherData>().Property(a => a.VendorId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 
     modelBuilder.Entity<WeatherData>().Property(a => a.WeatherStationId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 
     modelBuilder.Entity<WeatherData>().HasKey(w => new 
     { 
      w.VendorId, 
      w.WeatherStationId 
     }); 
    } 
関連する問題