我正在使用Entity Framework并且连接到MySQL数据库。 id列设置为使用StoreGeneratedPattern Identity,并且数据库中的列已设置为自动递增。当我创建一个新对象并将其保存到数据库时,该项目在数据库中正确发布。但是,保存后,C#中对象的ID保持为0,而不是反映该值比数据库分配的值。
代码部分如下:
Group newGroup = new Group("MyGroupName", "Active");
dbContext.Groups.Add(newGroup);
dbContext.SaveChanges();
int testId = newGroup.id;
即使“newGroup”使用数据库分配的id保存在数据库中,当我读取id时(例如我在读取testId时),id仍为0.
根据this,我尝试添加
dbContext.Entry(newGroup).Reload();
在SaveChanges()之后我也尝试过(基于this和this)添加
var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext;
objectContext.Refresh(System.Data.Objects.RefreshMode.StoreWins, newGroup);
在SaveChanges()尝试从数据库刷新对象(以及因此id)之后,问题仍然存在。如何获取数据库分配的ID?
编辑:为群组添加班级定义:
[Table("groups")]
public partial class Group
{
public Group()
{
this.user_groups = new HashSet<UserGroup>();
}
public long id { get; set; }
public string name { get; set; }
public string status { get; set; }
public System.DateTime created_at { get; set; }
public System.DateTime updated_at { get; set; }
public virtual ICollection<UserGroup> user_groups { get; set; }
}
答案 0 :(得分:0)
尝试使用[Key]属性修饰您的ID。
答案 1 :(得分:0)
它应该是这个属性
[DatabaseGenerated(DatabaseGenerationOption.Identity)]
但是,这应该是默认值。
[Key]
属性应该是不必要的,因为列名Id
是神奇的......虽然这可能只是在使用C#的接受命名约定时的情况。
我想知道您的long
属性是id
可能是Id
,还是可能是命名约定......您可以尝试命名{{1}}。
答案 2 :(得分:0)
我的项目遇到了同样的问题。我为解决方法所做的是按ID降序排序表(组)并选择第一个或默认记录,然后选择ID列。
var newID = dbcontext.Groups.OrderByDescending(x => x.id).FirstOrDefault().ID
然后,您可以将其分配给您需要的任何内容并再次保存更改。我知道这是一个老线程,但希望这会有所帮助。似乎应该有更好的方法来做到这一点......