我将对象添加到数据库中,因为我想要自己指定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)。同样的问题
答案 0 :(得分:2)
1.-在您的edmx设计器中,右键单击id列,选择属性
2.-在StoreGeneratedPattern中选择None
正如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
。