Linq To EF (添加记录后获取添加的自增ID和叫“ID”的列不是自增列不让插入的问题)

Posted siyunianhua

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linq To EF (添加记录后获取添加的自增ID和叫“ID”的列不是自增列不让插入的问题)相关的知识,希望对你有一定的参考价值。

1:添加记录后,如何获取新添加的ID的值

比如,一个实体 TestEntity   对应一个表TestEntity(ID主键自增,Name,age),使用linq to ef   添加一条记录后,如何获取新记录的ID值?如下代码:

var te = new TestEntity ()
{
Name = "名字",
Age = 21
};
using (EFDbContext context = new EFDbContext())
{
context.TestEntity .Add(te);
context.SaveChanges();
return te.ID;
}
调用SaveChanges()之后,ef.ID的值就是数据库中新加记录对应自增标识列的值。Linq to ef智能地判断出ID就是自增主键标识列。 他给我们返回了。

 

2:列名叫“ID”的列,它不是自增列,linq to ef不让插入的问题

如标题,就是,列名叫“ID”的列,它不是主键,也不是主键,linq to ef不让插入。我已经给ID赋值了 但它一直提示 ID不能为NULL  ,打断点,看了,也有值!

代码走到SaveChanges(),就报异常,提示ID不能为空!超蛋疼...

原因:默认情况,linq to ef认为只要实体类中有ID属性,数据库对应的是一定是自增标识列。

解决方式:

1)第一步

因为EFDbContex继承自Context类,所以,我们需要从新对它这个叫OnModelCreating的虚函数进行实现

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<TestEntity>().Property(p => p.ID)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
}

2)第二步

在实体类叫ID的属性上加标记实现(记得添加引用):

public class TestEntity
{
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int ID { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
OK。

 

以上是关于Linq To EF (添加记录后获取添加的自增ID和叫“ID”的列不是自增列不让插入的问题)的主要内容,如果未能解决你的问题,请参考以下文章

Linq-to-SQL 数据检索速度比较

InnoDB的自增键和row_id用完了会发生什么?

使用ado.net 如何获取新添记录的自增id值?

使用 LINQ to SQL 获取 ID

怎么在thinkphp添加数据时获取自动增长的id

用 LINQ to SQL 或 LINQ to EF 替换 NHibernate