[英]Can't insert entity with foreign key in Entity Framework
我正在使用 ASP.NET MVC 框架為移動應用程序構建后端。 我有兩個對象:
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);
}
}
當我嘗試添加帶有 Trip = null 的新 CarLogItem 時,沒問題,但是當 Trip 是特定對象時,它會失敗並出現以下異常:
提交的實體無效:屬性“Id”的驗證錯誤:Id 字段是必需的
如何正確添加帶有嵌套 TripItem 的新 CarLogItem?
我認為您需要在 TripItem 上填充 Id 屬性,例如
var newTrip = new TripItem(){ Id = Guid.NewGuid() }
每個實體類中都需要一個主鍵字段,例如Id
或CarLogItemId
(ClassName + "Id")。 或者只是有一個帶有[Key]
屬性的屬性:
[Key]
public string/int/Guid/any-db-supported-type MyProp { get; set; }
實體框架依賴於每個具有用於跟蹤實體的鍵值的實體。 code first 依賴的約定之一是它如何暗示哪個屬性是每個 code first 類中的鍵。 該約定是查找名為“Id”的屬性或將類名和“Id”組合在一起的屬性,例如“BlogId”。 該屬性將映射到數據庫中的主鍵列。
請參閱此了解更多詳情。
我也懷疑這是一個問題:
public Lazy<CarLogItem> logItems { get; set; }
您不必將導航屬性標記為Lazy<>
。 它已經是惰性的(除非你有禁用延遲加載的配置)。 請嘗試刪除Lazy<>
並查看它是否以這種方式工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.