Entity Framework (EF) 是一个对象关系映射(ORM)框架,它允许开发者使用.NET对象与数据库交互,而不必直接编写SQL语句。主键(PK, Primary Key)是数据库表中唯一标识每一行的列,在EF中通常由Id
属性表示。
using (var context = new YourDbContext())
{
var newEntity = new YourEntity
{
Name = "Example",
Description = "This is a sample entity"
};
context.YourEntities.Add(newEntity);
context.SaveChanges(); // 插入数据库
// 保存后,EF会自动填充ID
int newId = newEntity.Id;
Console.WriteLine($"新插入记录的ID是: {newId}");
}
using (var context = new YourDbContext())
{
var entities = new List<YourEntity>
{
new YourEntity { Name = "First" },
new YourEntity { Name = "Second" },
new YourEntity { Name = "Third" }
};
context.YourEntities.AddRange(entities);
context.SaveChanges();
foreach (var entity in entities)
{
Console.WriteLine($"插入的实体ID: {entity.Id}");
}
}
EF支持多种主键类型:
原因: 未调用SaveChanges()
或数据库未正确配置自增
解决方案:
SaveChanges()
IDENTITY
解决方案: 使用批量操作优化
context.BulkInsert(entities); // 使用第三方库如EntityFramework.BulkExtensions
解决方案: 使用乐观并发控制
public class Product
{
[Key]
public int Id { get; set; }
[Timestamp]
public byte[] RowVersion { get; set; }
// 其他属性...
}
var idParam = new SqlParameter("@NewId", SqlDbType.Int) { Direction = ParameterDirection.Output };
context.Database.ExecuteSqlCommand("EXEC sp_InsertProduct @Name, @NewId OUTPUT",
new SqlParameter("@Name", "New Product"),
idParam);
int newId = (int)idParam.Value;
var tempId = Guid.NewGuid();
var newEntity = new YourEntity { TempId = tempId };
context.YourEntities.Add(newEntity);
context.SaveChanges();
var savedEntity = context.YourEntities.First(e => e.TempId == tempId);
Console.WriteLine($"实际ID: {savedEntity.Id}");
通过以上方法,你可以有效地使用Entity Framework插入数据并获取生成的主键ID,满足各种业务场景需求。