繁体   English   中英

Entity Framework Code First SaveChanges 创建一个新对象

[英]Entity Framework Code First SaveChanges creates a new object

我在我的项目中使用 Code First 方法。

这是我的对象:

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

如果我创建一个新记录,那就可以了:

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 而不是整数?

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

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

在任何情况下,这个简单的控制台应用程序都会使用您的设置并按预期工作。 如果您在代码中没有看到更改 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();
            }
        }
    }
}

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

这是我的对象:

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

如果创建新记录,可以:

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而不是整数呢?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM