EF5 始终将 id 设置为 0

EF5 always sets id to 0

我正在将对象添加到数据库中,由于我想自己指定 ID,因此数据库中的 ID 不是自动生成的(我知道这很愚蠢,只是一起玩 ^^)

所以我使用 Entity Framework 5 将数据插入数据库,但是,即使我在保存之前设置了 id,当我查看数据库它总是零。为什么会这样,我该如何解决?

代码是这样的:

    public Profile Add()
    {
        Profile item = new Profile()
        {
            id = 1,
            name = "Bob"
        };

        db.Entry(item).State = EntityState.Added;
        db.SaveChanges();
        return item;
    }


编辑

我尝试使用 db.Profiles.Add(item)。同样的问题

您需要指定要将其添加到的 table。

所以对你来说就是 db.NAMEOFTABLE.add(item)

通常您不必将实体状态更改为已添加。 至少我不必在我的解决方案中这样做。

您需要将实体添加到代表您的配置文件的 DbSet table...类似这样...

public Profile Add()
    {
        Profile item = db.Profiles.Create();
        item.Name = "Bob";

        db.Profiles.Add(item);
        db.SaveChanges();
        return item;
    } 

我更喜欢使用 Create 方法,但这没有区别。

检查你的数据库和你的模型实际上是一样的。 如果您从现有数据库创建模型然后更改数据库,则您的模型不同步。当然,代码优先也会发生这种情况。 底线是您的 sql 将执行没有 id 值的插入,因为 EF 认为您的 id 将来自数据库。如果您检查 sql,您将看到一个没有提供 id 的插入,然后是 select 以获取 id 的值。 结论是你的model和db不一样

右键单击设计器并从数据库更新模型。 您可能需要删除您的 id 列,或者首先删除 table,EF 将更正所有内容

默认情况下 Id 属性 被 Entity Framework 视为主键和身份。所以它只是忽略 属性 值,同时为插入命令生成 sql 。您应该明确指定元数据:添加 [DatabaseGenerated(DatabaseGeneratedOption.None)] 属性或使用 FluentApi 中的方法 HasDatabaseGeneratedOption

1.- 在您的 edmx 设计器中,右键单击 id 列,select 属性

2.- 在 StoreGeneratedPattern select None

正如 PhilipStuyck 所说,您的模型与数据库不同步,无论何时更改数据库,都必须更新模型(在 edmx 设计器中右键单击空白 space select Update model from database).