C# Can';t在实体框架中插入带有外键的实体
我正在使用ASP.NET MVC框架为移动应用程序构建后端。 我有两个目标: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
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,但没有意义。这两种情况都是相同的例外。我编辑了这篇文章。