EF5始终将id设置为0

时间:2015-01-11 18:38:07

标签: c# entity-framework

我将对象添加到数据库中,因为我想要自己指定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)。同样的问题

5 个答案:

答案 0 :(得分:2)

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

2.-在StoreGeneratedPattern中选择None

enter image description here

正如PhilipStuyck所说,您的模型与您的数据库不同步,每当您更改数据库时,您必须更新模型(右键单击edmx designer中的空白区域选择Update model from database)。

答案 1 :(得分:1)

检查您的数据库和模型是否实际相同。 如果您从现有数据库创建模型然后更改了数据库,那么您的模型将不同步。当然,这也可以通过代码首先发生。 底线是你的sql会做一个没有id值的插入,因为EF认为你的id将来自数据库。如果您检查sql,您将看到一个没有提供id的插入,然后是select以获取id的值。 结论是你的模型和数据库不一样。

右键单击设计器并从数据库更新模型。 您可能必须删除您的id列,或者开头的表格,EF将更正所有内容

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

您需要将实体添加到代表您的个人资料表的DbSet ......就像这样......

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

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

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

答案 4 :(得分:0)

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