我正在使用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(),则ballastTypesIQueryable,并且仅在枚举时才进行评估。如果在BallastTypeId之后检查SaveChanges的值,则实质上是在重新运行LINQ语句,并重新读取文件的内容。这意味着在查找插入的ID时读取的实体不是您在上下文中插入的实体。

如果添加.ToList(),则ballastTypes成为列表而不是IQueryable,并且可以被多次评估。

关于c# - Entity Framework 未填充 key ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35920779/

10-13 03:04