簡體   English   中英

帶有身份的ASP.NET:實體框架在SaveChanges上引發System.Data.Entity.Core.UpdateException

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM