C# 具有导航属性的实体的ef core插入列表
我有一个模型C# 具有导航属性的实体的ef core插入列表,c#,entity-framework,entity-framework-core,C#,Entity Framework,Entity Framework Core,我有一个模型 public class Lessee { public long Id { get; set; } public string LesseeName { get; set; } public bool? LogicalDeleteIn { get; set; } } 和另一个具有导航属性的模型 public class RevenueReceived { public long Id
public class Lessee
{
public long Id { get; set; }
public string LesseeName { get; set; }
public bool? LogicalDeleteIn { get; set; }
}
和另一个具有导航属性的模型
public class RevenueReceived
{
public long Id { get; set; }
...
public Lessee Lessee { get; set; }
}
然后我填充一个承租人列表并插入,这样就可以了
public List<Lessee> InsertLessees(List<Lessee> lessees)
{
using (var ctx = new DataContext())
{
ctx.Lessees.AddRange(lessees);
ctx.SaveChanges();
return lessees;
}
}
公共列表插入承租人(列表承租人)
{
使用(var ctx=new DataContext())
{
ctx.Lesses.AddRange(承租人);
ctx.SaveChanges();
归还承租人;
}
}
然后我创建一个RevenueReceived列表并添加相应的承租人
public List<RevenueReceived> GetRevenueReceived(List<Lessee> lessees)
{
List<RevenueReceived> retval = new List<RevenueReceived>();
using (OleDbConnection con = new OleDbConnection(accessConnectionString))
using (OleDbCommand Command = new OleDbCommand(" SELECT * from tblRevenueReceived", con))
{
con.Open();
OleDbDataReader DB_Reader = Command.ExecuteReader();
while (DB_Reader.Read())
{
string lesseeName = DB_Reader.IsDBNull(DB_Reader.GetOrdinal("Company")) ? null : DB_Reader.GetString(DB_Reader.GetOrdinal("Company"));
retval.Add(new RevenueReceived
{
Id = 0,
...
Lessee = string.IsNullOrEmpty(lesseeName) ? null : lessees.FirstOrDefault(x => x.LesseeName == lesseeName)
});
}
}
return retval;
}
公共列表GetRevenueReceived(列表承租人)
{
List retval=新列表();
使用(OleDbConnection con=新OleDbConnection(accessConnectionString))
使用(OleDbCommand命令=新的OleDbCommand(“从TBLREVenuerReceived中选择*,con))
{
con.Open();
OleDbDataReader DB_Reader=Command.ExecuteReader();
while(DB_Reader.Read())
{
string lesseeName=DB_Reader.IsDBNull(DB_Reader.GetOrdinal(“公司”))?null:DB_Reader.GetString(DB_Reader.GetOrdinal(“公司”);
retval.Add(新收入已收到)
{
Id=0,
...
承租人=string.IsNullOrEmpty(lesseeName)?null:lessees.FirstOrDefault(x=>x.lesseeName==lesseeName)
});
}
}
返回返回;
}
最后,我尝试保存收到的收入列表
public void InsertRevenuesReceived(List<RevenueReceived> revenuesReceived)
{
using (var ctx = new DataContext())
{
ctx.RevenueReceived.AddRange(revenuesReceived);
ctx.SaveChanges();
}
}
public void InsertRevenuesReceived(列表revenuesReceived)
{
使用(var ctx=new DataContext())
{
ctx.RevenueReceived.AddRange(RevenueReceived);
ctx.SaveChanges();
}
}
我收到下面的错误。我有点困惑,为什么它试图再次插入承租人表。有没有办法只插入主键,而不让它再次插入承租人
Microsoft.EntityFrameworkCore.DbUpdateException HResult=0x80131500消息=更新条目时出错。看内在 详细信息除外。
Source=Microsoft.EntityFrameworkCore.Relational StackTrace:位于 Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.Execute(IRelationalConnection 连接)在 Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.Execute(DbContext _,在Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.Execute[TState,TResult](TState 状态,Func3操作,Func
3验证成功)
Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.Execute(IEnumerable
1
commandBatches,IRelationalConnection)位于
Microsoft.EntityFrameworkCore.Storage.RelationalDatabase.SaveChanges(IList1
参赛作品)在
Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(IList
1
(保存)在
Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(布尔值
可接受的改变(成功)
Microsoft.EntityFrameworkCore.DbContext.SaveChanges(布尔值
可接受的改变(成功)
Microsoft.EntityFrameworkCore.DbContext.SaveChanges()位于
accessdataimport.DataImportService.InsertRevenuesReceived(列表'1
(收到的)收入
C:\Users\C-bdelling\source\repos\Minerals\accessdataimport\DataImportService.cs:line
在中的accessdataimport.Program.Main(字符串[]args)处为100
C:\Users\C-bdelling\source\repos\Minerals\accessdataimport\Program.cs:line
二十九
内部异常1:SqlException:无法为插入显式值
当identity_INSERT设置为OFF时,表“承租人”中的identity列
这回答了你的问题吗?不,我不这么认为。我相信我的问题是它试图插入到子表(承租人)中,我不希望它这样做。(正如我已经插入承租人)您的
RevenueReceived
模型上是否有承租人的FK财产?e、 g.public long-seenate_-Id{get;set;}
是的,我认为您不需要设置每个RevenueReceived对象的承租人属性,只需设置LesseeId即可。不,我只是隐式地这样做。但我可以加上一个,我只是在仔细阅读。所以我会更新fk,然后将子对象设置为未更改?