2016-04-25 10 views
1

ASP.NET MVCフレームワークを使用したモバイルアプリケーションのバックエンドを構築しています。 は、私は2つのオブジェクトがあります。エンティティフレームワークに外部キーを持つエンティティを挿入できません

public class CarLogItem : EntityData 
{ 
    public CarLogItem(): base() 
    { 
     Time = DateTime.Now; 
    } 

    public DateTime Time { get; set; } 

    public int RPM { get; set; } 
    public int Speed { get; set; } 
    public int RunTime { get; set; } 
    public int Distance { get; set; } 
    public int Throttle { get; set; } 

    [ForeignKey("Trip")] 
    public String Trip_id { get; set; } 

    // Navigation property 
    public TripItem Trip { get; set; } 
} 

public class TripItem : EntityData 
{ 
    public TripItem() : base() 
    { 
     UserId = User.GetUserSid(); 
     StartTime = DateTime.Now; 
     logItems = new List<CarLogItem>(); 
    } 
    public string UserId { get; set; } 

    public List<CarLogItem> logItems {get;set;} 
    public DateTime StartTime { get; set; } 
} 

を、私は、データベースに新しいCarLogItemを追加するコントローラを持っています。

public class CarLogItemController : TableController<CarLogItem> 
{ 
    // POST tables/CarLogItem 
    public async Task<IHttpActionResult> PostCarLogItem(CarLogItem item) 
    { 
     var lastItem = db.CarLogItems.OrderByDescending(x => x.Time).FirstOrDefault(); 
     //lastItem = (Query().Where(logitem => true).OrderBy(logitem => logitem.Time)).Last(); 

     //checking if lastItem.Trip isn't null because 
     // I have entities with Trip field is null, but all of them should have it. 
     if (lastItem != null && lastItem.Trip != null && item.RunTime > lastItem.RunTime) 
     { 
      item.Trip = lastItem.Trip; 
     } 

     //In order to test adding of new TripItem entity to database 
     // I compare item.RunTime with 120, so it always true 
     else if (lastItem == null || item.RunTime < 120) // < lastItem.RunTime) 
     { 
      var newTrip = new TripItem(); 
      item.Trip = newTrip; 
     } 
     else 
     { 
      throw new ArgumentException(); 
     } 

     CarLogItem current = await InsertAsync(item); 

     return CreatedAtRoute("Tables", new { id = current.Id }, current); 
    } 
} 

私は旅で新しいCarLogItemを追加しようとしている= nullを、それは大丈夫だが、旅は、特定のオブジェクトがあるときには、次の例外で失敗します。提出されたエンティティが無効だった

:検証エラーにプロパティ 'Id':Idフィールドが必要です

入れ子になったTripItemで新しいCarLogItemを正しく追加する方法はありますか?

+0

'Id'プロパティを設定する必要があることは明らかですが、何かが' Id'プロパティを持っていることを示すコードはありません。 –

+0

「TripItem」主キーとは何ですか?私はあなたのモデルでそれを見ることができません。 – Balde

+0

どちらのエンティティもEntityDataのIdプロパティを継承します –

答えて

1

あなたのTripItemにIdプロパティを設定する必要があると思います。

var newTrip = new TripItem(){ Id = Guid.NewGuid() } 
+0

EntityDataのベースコンストラクタで設定されていませんか? CarLogItemのIDを挿入した後に設定していません。 CarLogItem current = InsertAsync(item);を待機しています。 Idを持つCarLogItemを返します –

+0

私はそのコードを見ることができませんので、わかりません –

+0

IdIt初期化をTripItemコンストラクタ 'Id = Guid.NewGuid()。ToString();'に追加しました。しかし、私はまだMVCがCarlogItemのIDを自動的に生成する理由を理解していませんが、TripItemのためにIdを生成しません。 –

0

あなたはIdまたはCarLogItemId(クラス名+ "ID")などのすべてのエンティティクラスの主キーフィールドを、必要とします。それとも[Key]属性を持つプロパティを持っている:

[Key] 
public string/int/Guid/any-db-supported-type MyProp { get; set; } 

Entity Frameworkのは、それが が追跡エンティティに使用するキー値を持つすべてのエンティティに依存しています。最初に をコードする規則の1つは、 コードの各クラスのどのキーがどのプロパティをキーに含めるかということです。このコンベンションでは、 "Id"という名前のプロパティ、または "BlogId"などのクラス名と "Id"を組み合わせたプロパティを検索します。 プロパティは、データベースの主キー列にマップされます。

詳しくはthisを参照してください。


また、私はこれが問題であることを疑う:

public Lazy<CarLogItem> logItems { get; set; } 

あなたはLazy<>としてナビゲーションプロパティをマークする必要はありません。あなたが遅延読み込みを無効にする設定をしていない限り、それはすでに怠惰です。 Lazy<>を削除して、この方法で動作するか確認してください。

+0

はい、 。私はちょうどレイジーを使用しようとしていたが、それは意味をなさない。どちらの場合も同じ例外です。 投稿を編集しました。 –

関連する問題