我正在使用LINQ和Entity Framework从定界文件中导入数据,并且在一种情况下EF未填充键属性。该类是:
public class BallastType
{
public int BallastTypeId { get; set; }
public string Name { get; set; }
}
该文件包含一个标题行和每个条目的一行。导入它的代码是:
var baseDir = AppDomain.CurrentDomain.BaseDirectory;
var seedDataPath = Path.Combine(baseDir, "bin", "SeedData");
var ballastTypesFile = Path.Combine(seedDataPath, "BallastTypes.txt");
var ballastTypes = (from l in File.ReadAllLines(ballastTypesFile).Skip(1)
let x = l.Split('\t').ToArray()
select new BallastType()
{
Name = x[0]
});
context.BallastTypes.AddRange(ballastTypes);
context.SaveChanges();
运行此代码将插入所有实体,但BallastTypeId尚未初始化(0)。如果我在选择后添加ToList ...
...select new BallastType()
{
Name = x[0]
}).ToList();
它按预期工作,并填充BallastTypeId。需要注意的是,我正在断点处对此进行检查。
为什么添加ToList会使EF正常工作?我正在使用EF 6.1.3。
最佳答案
如果没有.ToList()
,则ballastTypes
是IQueryable
,并且仅在枚举时才进行评估。如果在BallastTypeId
之后检查SaveChanges
的值,则实质上是在重新运行LINQ语句,并重新读取文件的内容。这意味着在查找插入的ID时读取的实体不是您在上下文中插入的实体。
如果添加.ToList()
,则ballastTypes
成为列表而不是IQueryable
,并且可以被多次评估。
关于c# - Entity Framework 未填充 key ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35920779/