簡體   English   中英

無法在實體框架中插入帶有外鍵的實體

[英]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() }

每個實體類中都需要一個主鍵字段,例如IdCarLogItemId (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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM