![](/img/trans.png)
[英]Entity Framework 4 throws System.Data.UpdateException when deleting object
[英]ASP.NET w/ Identity: Entity Framework throws System.Data.Entity.Core.UpdateException on SaveChanges
我正在嘗試構建一個應該便於拼車的ASP.NET應用程序。 為此,我使用身份框架將帳戶和實體框架作為ORM進行管理。 我也為模型使用Identity的ApplicationDbContext,因此代碼優先遷移不會出現問題,因為我需要UserProfile對象和Identity的ApplicationUser之間存在一對一的關系。
這是我的模型:
public class UserProfile
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string Name { get; set; }
public string FirstName { get; set; }
public string Email { get; set; }
public string UserName { get; set; }
public virtual List<Trip> Trips { get; set; } = new List<Trip>();
public virtual List<Meeting> Meetings { get; set; } = new List<Meeting>();
}
public class Trip
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[Required]
public virtual TripCheckpoint Departure { get; set; }
[Required]
public virtual TripCheckpoint Destination { get; set; }
[Required]
public int Seats { get; set; }
[NotMapped]
public int AvailableSeats => Seats - Passengers.Count;
[Required]
public virtual UserProfile Organizer { get; set; }
public double Price { get; set; } = 0.0;
public virtual List<UserProfile> Passengers { get; } = new List<UserProfile>();
public virtual DateTime Date { get; set; }
}
public class TripCheckpoint
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int CheckPointId { get; set; }
[Required]
public string Place { get; set; }
[Required]
public TimeSpan Hour { get; set; }
}
public class Meeting
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public DateTime When { get; set; }
public string Where { get; set; }
}
這是我的ApplicationDbContext:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public DbSet<UserProfile> Profiles { get; set; }
public DbSet<Trip> Trips { get; set; }
public DbSet<TripCheckpoint> Checkpoints { get; set; }
public DbSet<Meeting> Meetings { get; set; }
public ApplicationDbContext()
: base("helmoCars", throwIfV1Schema:false)
{
}
public static ApplicationDbContext Create()
{
return new ApplicationDbContext();
}
protected override void OnModelCreating(DbModelBuilder dbBuilder)
{
base.OnModelCreating(dbBuilder);
dbBuilder.Entity<ApplicationUser>().HasRequired(u => u.Profile).WithRequiredPrincipal().Map(m => m.MapKey("AppUser_Id"));
dbBuilder.Entity<Trip>().HasMany(t => t.Passengers).WithMany().Map(m =>
{
m.ToTable("Trip_Passengers");
m.MapLeftKey("Trip_Id");
m.MapRightKey("UserProfile_Id");
});
dbBuilder.Entity<Trip>().HasRequired(t => t.Organizer).WithMany(u => u.Trips).Map(m => m.MapKey("Trip_Organizer"))
.WillCascadeOnDelete(false);
dbBuilder.Entity<Trip>().HasRequired(t => t.Departure).WithRequiredDependent().Map(m => m.MapKey("Trip_Departure")).WillCascadeOnDelete(false);
dbBuilder.Entity<Trip>().HasRequired(t => t.Destination).WithRequiredDependent().Map(m => m.MapKey("Trip_Destination")).WillCascadeOnDelete(false);
}
}
這就是我使用ApplicationDbContext的方式:
public class TripRepository
{
private ApplicationDbContext _db;
public TripRepository(ApplicationDbContext context)
{
this._db = context;
}
public void AddTrips(List<Trip> trips)
{
_db.Database.Log = message => Debug.Write(message);
_db.Trips.AddRange(trips);
_db.SaveChanges();
}
}
我這樣使用TripRepository:
ApplicationDbContext context = HttpContext.GetOwinContext().Get<ApplicationDbContext>();
var tr = new TripRepository(context);
tr.AddTrips(trips); // trips is a valid List<Trip>
每次調用它時,ApplicationDbContext的SaveChanges()方法都會引發System.Data.Entity.Core.UpdateException,即使我確定添加到DbSet的行程是一個有效的List,我也會通過調試器對其進行檢查。 唯一的例外是我收到的反饋,所以我真的不知道自己在做什么錯。
這是我在調試輸出窗口中獲得的唯一反饋:
Exception levée : 'System.Data.Entity.Core.UpdateException' dans
EntityFramework.dll
Exception levée : 'System.Data.Entity.Core.UpdateException' dans
EntityFramework.SqlServer.dll
Exception levée : 'System.Data.Entity.Infrastructure.DbUpdateException' dans
EntityFramework.dll
Exception levée : 'System.Data.Entity.Infrastructure.DbUpdateException' dans
System.Web.Mvc.dll
Exception levée : 'System.Data.Entity.Infrastructure.DbUpdateException' dans
System.Web.Mvc.dll
這是我填寫之后提供給AddTrips方法的列表的方式(其中trip是我從表單獲取的視圖模型):
trips.Add(new Trip()
{
Date = trip.Date,
Price = trip.Price,
Seats = trip.Seats,
Organizer = user,
Departure = new TripCheckpoint() { Place = trip.DeparturePlace, Hour = trip.DepartureHour.TimeOfDay },
Destination = new TripCheckpoint() { Place = trip.DestinationPlace, Hour = trip.DestinationHour.TimeOfDay }
});
我在視圖中發現了更好的日志(我正在使用AJAX)。 對於其他有問題的人,如果您希望更好的日志來查找錯誤,請嘗試使用html表單將其嘗試並在工作后將其轉換為ajax表單。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.