2016-04-22 16 views
1

私はEF7を初めて使い、奇妙な問題に遭遇しています。派生型のキー...しかしそれはありません

public class Site 
{ 
    public int ID { get; set; } 
    public string Title { get; set; } 
    public string HouseNumber { get; set; } 
    public string StreetName { get; set; } 
    public string City { get; set; } 
    public string State { get; set; } 
    public string Zipcode { get; set; } 
    public double Latitude { get; set; } 
    public double Longitude { get; set; } 
    public DataSource Source { get; set; } 

    public object Parameters 
    { 
     get 
     { 
      switch(Source) 
      { 
       case DataSource.StealthStats: 
        return JsonConvert.DeserializeObject<StealthStatsParameters>(JSONParameters); 

       default: 
        throw new Exception("Site::Parameters::get() - Unhandled DataSource " + Source.ToString()); 
      } 
     } 

     set 
     { 
      switch(Source) 
      { 
       case DataSource.StealthStats: 
        JSONParameters = JsonConvert.SerializeObject(value); 
        break; 

       default: 
        throw new Exception("Site::Parameters::set() - Unhandled DataSource " + Source.ToString()); 
      } 
     } 
    } 

    protected string JSONParameters { get; set; } 

    public List<Observation> Observations { get; set; } 
} 

とコンテキストのOnModelCreatingでこのロジック():私はこのクラスの持っている

protected override void OnModelCreating(ModelBuilder builder) 
{ 
    base.OnModelCreating(builder); 
    // Customize the ASP.NET Identity model and override the defaults if needed. 
    // For example, you can rename the ASP.NET Identity table names and more. 
    // Add your customizations after calling base.OnModelCreating(builder); 

    builder.Entity<Site>() 
     .HasKey(t => t.ID); 
    builder.Entity<Site>() 
     .Property(s => s.City) 
     .IsRequired(); 
    builder.Entity<Site>() 
     .Property(s => s.HouseNumber) 
     .IsRequired(); 
    builder.Entity<Site>() 
     .Property(s => s.Source) 
     .IsRequired(); 
    builder.Entity<Site>() 
     .Property(s => s.State) 
     .IsRequired() 
     .HasMaxLength(2); 
    builder.Entity<Site>() 
     .Property(s => s.StreetName) 
     .IsRequired(); 
    builder.Entity<Site>() 
     .Property(s => s.Title) 
     .IsRequired(); 
    builder.Entity<Site>() 
     .Property(s => s.Zipcode) 
     .IsRequired() 
     .HasMaxLength(10); 

    builder.Entity<Observation>() 
     .HasKey(t => new { t.SiteID, t.TimeStamp }); 
    builder.Entity<Observation>() 
     .HasOne(o => o.Site) 
     .WithMany(s => s.Observations); 

} 

をしかし、私はマイグレーションが追加DNX EFを実行したとき、私はこのエラーメッセージが出ます:

を派生型 'SpeedView.Models.Site'は、ルート型で宣言されたもの以外のキーを持つことはできません。

ただし、私が見る限り、サイトは何に由来するものでもありません。

ところで、ここで重要なの場合には、クラスの観察のための定義です:余談として

public class Observation 
{ 
    public int SiteID { get; set; } 

    public DateTime TimeStamp { get; set; } 

    public int MPH { get; set; } 

    public int VehicleCount { get; set; } 

    public virtual Site Site { get; set; } 
} 

を、誰もが私はそれを感謝良いチュートリアルやEF7の説明へのリンクをお勧めすることができます。私はEFで何年も働いた後、非常に険しく、私がオンラインで見つけたものはあまり役に立ちません。

答えて

1

これをEntity Frameworkのgithubサイトに掲載し、Smit Patelはすぐに質問に答え、何が起こっているのかを説明しました。彼が書いたものはhttps://github.com/aspnet/EntityFramework/issues/5151で読むことができます。サンクス、パテル!

短いバージョンは次のとおりです。EFクラスのオブジェクトプロパティは、EF移行を作成するコードによってオブジェクトタイプをスキャン全体に含めるようにします。すべてのクラスはオブジェクトの子孫であり、オブジェクトには固有のプライマリキーがないため、すべてのクラスは「ルートクラスのみがキーを定義できる」という制限に反して実行されます。

解決策は、オブジェクトプロパティを基になるデータベースにマップしないことです(これが私のやり方です)。

このようにすると、[NotMapped]アノテーションをプロパティに適用して、意図を伝える必要があるように見えることがわかりました。流暢なAPIアプローチ:

builder.Entity<T>().Ignore(t => t.PropertyToIgnore); 

は機能しません。

関連する問題