Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Can';t在实体框架中插入带有外键的实体_C#_Asp.net_Asp.net Mvc_Entity Framework - Fatal编程技术网

C# Can';t在实体框架中插入带有外键的实体

C# Can';t在实体框架中插入带有外键的实体,c#,asp.net,asp.net-mvc,entity-framework,C#,Asp.net,Asp.net Mvc,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 { ge

我正在使用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; }
}

公共类TripItem:EntityData
{
公共TripItem():base()
{
UserId=User.GetUserSid();
StartTime=DateTime.Now;
logItems=新列表();
}
公共字符串用户标识{get;set;}
公共列表登录项{get;set;}
公共日期时间开始时间{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);
    }
}
公共类CarLogItemController:TableController
{
//POST表格/CarLogItem
公共异步任务PostCarLogItem(CarLogItem项)
{
var lastItem=db.CarLogItems.OrderByDescending(x=>x.Time).FirstOrDefault();
//lastItem=(Query().Where(logitem=>true).OrderBy(logitem=>logitem.Time)).Last();
//正在检查lastItem.Trip是否不为null,因为
//我有Trip字段为null的实体,但所有实体都应该有它。
if(lastItem!=null&&lastItem.Trip!=null&&item.RunTime>lastItem.RunTime)
{
item.Trip=lastItem.Trip;
}
//为了测试向数据库添加新TripItem实体
//我将item.RunTime与120进行比较,因此它总是正确的
else if(lastItem==null | | item.RunTime<120)/
当我尝试添加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; }
实体框架依赖于每个实体,每个实体都有一个关键值 用于跟踪实体。首先编码的约定之一 这取决于它如何暗示哪个属性是每个 编码第一类。该约定是查找名为 “Id”或组合类名和“Id”的一个,如“BlogId”。 属性将映射到数据库中的主键列

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);
    }
}
有关更多详细信息,请参阅


我还怀疑这是一个问题:

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

您不必将导航属性标记为
Lazy
。它已经是惰性的(除非您有禁用惰性加载的配置)。请尝试删除
Lazy
,看看它是否可以这样工作。

很明显,您需要设置
Id
属性,但是您没有给出任何代码来证明任何东西都有
Id
属性。什么是
TripItem
主键?我在您的模型中看不到它。我的两个实体都从EntityData@Мааааааааааааааааааааааааа?我没有为CarLogItem设置Id,在插入CarLogItem current=Wait InsertAsync(项目)之后;它返回带有IdI的CarLogItem,并将Id初始化添加到TripItem构造函数
Id=Guid.NewGuid().ToString()现在它可以工作了。但我仍然不明白为什么MVC会自动为CarlogItem生成Id,但不要为TripItem生成Id。这可能是DB的设置方式,以及它是否自动生成Id和Id值是的,实际上它应该是列表。我只是想用Lazy,但没有意义。这两种情况都是相同的例外。我编辑了这篇文章。