我对实体框架有一个奇怪的问题,在我的项目中使用EF 6 codefirst和我的数据库即时使用sqlserver 2012
与表iam一样,使用bit类型的isactive列,它仅代表0或1。默认情况下,我将此列值保持为1,表示为真。
当我们想要从表中删除记录时,我们应该使1到0,但实体框架不会更新该值。
任何一个有这个奇怪问题的人都有解决方案吗?
代码:
using (var context = new TriviaContext())
{
var booking = context.Booking.FirstOrDefault(b => b.BookingId == id);
context.Entry(booking).Property(u => u.IsActive).IsModified=true;
booking.IsActive = false;
context.SaveChanges();
return Ok(booking);
}
预订模式:
class Booking
{
public int BookingId { get; set; }
public string Name{get;set;}
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public bool? IsActive { get; set; }
}
编辑:实际上我在我的模型类中包含了DatabaseGenerated属性,可能这是导致问题的?
TriviaContext:
public class TriviaContext : DbContext
{
public TriviaContext()
: base("name=DefaultConnection")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
public DbSet<Bookings> Booking { get; set; }
}
答案 0 :(得分:1)
我正在使用[DatabaseGenerated(DatabaseGeneratedOption.Computed)]属性来默认生成值,但这导致我实体框架dint生成sql来更新记录,所以当我删除这个属性时EF能够生成更新的东西。所以我现在可以继续我的工作。但这种编码是对还是错......任何有经验的人都可以建议我解决这个问题......
此致 BOSH
答案 1 :(得分:0)
试试这个:
using (var context = new TriviaContext())
{
var booking = (from x in context.Booking
where x.BookingId == id
select x).First();
booking.IsActive = false;
context.SaveChanges();
return Ok(booking);
}
答案 2 :(得分:0)
加载并跟踪实体,因此无需使用Entry
方法更改属性值,只需更改并保存实体
using (var context = new TriviaContext())
{
var booking = context.Booking.Find(id);
booking.IsActive = false;
context.SaveChanges();
return Ok(booking);
}