我是EF的新手。假设我在数据库中有一个这样的表:
ID FirstName LastName DateOfBirth
-------------------------------------------
1 John Smith 1.1.1990
2 Mary Wilson 5.1.1991
现在,我使用EF将新实体插入表中:
dbcontext.Persons.Add(new Person
{
FirstName = "John",
LastName = "Smith",
DateOfBith = "1.1.1990"
});
dbcontext.SaveChanges();
我需要代码引发异常,因为该行已经存在于数据库中,但是EF所做的是将ID列加1并创建新记录:
ID FirstName LastName DateOfBirth
--------------------------------------------
1 John Smith 1.1.1990
2 Mary Wilson 5.1.1991
3 John Smith 1.1.1990
EF甚至有能力做到这一点吗?
最佳答案
您已经将ID
列定义为identity column,并且已将其视为主键,并且每次在表中插入新记录时都会将其增加一。这就是为什么允许您插入重复的实体。您需要在模型中(如果您使用代码优先方法)或通过使用Data Annotation来指定需要声明为PK的列,如下所示:
[Key]
public string FirstName { get; set; }
或通过使用唯一约束:
[Index("IX_UniqueConstraint", 1, IsUnique = true)]
public string FirstName { get; set; }
[Index("IX_UniqueConstraint", 2, IsUnique = true)]
public string LastName { get; set; }
[Index("IX_UniqueConstraint", 3, IsUnique = true)]
public DateTime DateOfBirth { get; set; }
您也可以将fluent API用于此目的:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Persons>().HasKey(c => new { c.FirstName, c.LastName, c.DateOfBirth });
}
或者,如果您使用的是DB-first方法,则可以在数据库中声明它。