我正在尝试将其保存到我的表中。用户说,字符串ID,字符串电子邮件和字符串密码。问题是ID必须是我必须创建并保存它的GUID,而不是SQL Server。有什么想法吗?我搜索了一下,但只找到了如何使sql server创建GUID。谢谢!
首先,告诉Entity Framework您将生成主键的值:使用DatabaseGenerated Attribute
public class School
{
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Id { get; set; }
public string Name {get; set;}
...
}
无选项可防止数据库在其他情况下会自动创建值。
此外,请考虑覆盖DbContext.SaveChanges()。在此过程中,向ChangeTracker询问添加的所有元素。为每个添加的元素生成一个ID。让其他人生成ID可能很危险,因为他们可能会添加一个恒定值或只是一个自动增量。
另一种可能性是在Add函数中生成它,但是如果您这样做,则用户可以更改您生成的ID。因此,正确的位置在SaveChanges中:
public override int SaveChanges()
{
var addedElements = this.ChangeTracker.Entries
.Where(entry => entry.State == EntityState.Added);
foreach(var addedElement in addedElements)
{
// This will fail: the added element doesn't have a property Id:
addedElement.Id = GenerateId();
}
return base.SaveChanges();
}
为此,您必须确保每个添加的元素都有一个属性ID。最简单的方法是创建一个接口,并让所有表实现此接口:
public interface IID
{
string Id {get; set;}
}
public class School : IID {...}
public class Student : IID {...}
public class Teacher : IID {...}
public class DbContext
{
public DbSet<School> Schools {get; set;}
public DbSet<Student> Students{get; set;}
public DbSet<Teacher> Teachers {get; set;}
public override int SaveChanges()
{
var addedElements = this.ChangeTracker.Entries.Cast<IID>
.Where(entry => entry.State == EntityState.Added);
foreach(var addedElement in addedElements)
{
addedElement.Id = GenerateId(); // Every Added element implements IId
}
return base.SaveChanges();
}
private string GenerateId()
{
... // TODO: return unique ID, for instance a GUID
}
}