我在项目中使用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!!
}
}
我是Entity框架的新手;为什么每次都创造新记录?它是ID的属性吗?如果是,那么我如何使用GUIDS作为ID而不是整数?
答案 0 :(得分:2)
“帐户”选项中的属性可以正常工作,将ID列设置为对象的主键。
如果在保存更改时将新条目添加到数据库中,则几乎可以肯定是在从数据库接收到对象后更改了对象的主键(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();
}
}
}
}