实体框架代码首先SaveChanges创建一个新对象

本文关键字:一个 框架 新对象 对象 SaveChanges 创建 实体 代码 | 更新日期: 2023-09-27 18:17:44

我在我的项目中使用代码优先的方法。

这是我的对象:

public class Account
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid ID { get; set; }
    public string name { get;set; }
}

如果我创建一个新记录,它是OK的:

using(var context = new context())
{
    context.Accounts.add(account);
    context.savechanges(); //This saves fine 
}

但是当我改变一个属性时,它会在数据库中保存另一条记录:

using (var context = new context())
{
    var account = context.Account.where(x => x.ID == GUID).FirstOrDefault();
    if (account != null)
    {
        account.name = "UpdatedName";
        context.savechanges(); // This creates a new record!!
    }
}

我是相当新的实体框架;为什么每次都要创建新记录?是ID上的属性吗?如果是,那么我如何使用GUIDS作为id而不是整数呢?

实体框架代码首先SaveChanges创建一个新对象

Account选项中的属性应该可以很好地将ID列设置为对象的主键。

如果您在保存更改时得到一个新条目添加到数据库中,那么几乎可以肯定的是,您在从DB接收到对象的主键(ID属性)后更改了它。也许您正在尝试在未包含的代码段中自己设置GUID属性?(你应该让DB分配它)。

在任何情况下,这个简单的控制台应用程序使用您的设置并按预期工作。如果您在代码中没有看到要更改GUID的明显位置,也许您可以发布实际的代码?(我注意到粘贴的内容中有几个拼写错误,所以它看起来不是您实际使用的内容)

public class Account
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid ID { get; set; }
    public string name { get; set; }
}
public class MyContext : DbContext
{
    public DbSet<Account> Accounts { get; set; }
}
class Program
{
    static Guid MyGuid = Guid.Empty;
    static void Main(string[] args)
    {
        using (var context = new MyContext())
        {
            Account account = new Account { name = "OldName" };
            context.Accounts.Add( account );
            context.SaveChanges();
            MyGuid = account.ID;
        }
        using (var context = new MyContext())
        {
            var account = context.Accounts.Where(x => x.ID == MyGuid).FirstOrDefault();
            if (account != null)
            {
                account.name = "UpdatedName";
                context.SaveChanges();
            }
        }
    }
}
相关文章: