【问题标题】:'Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.''一个或多个实体的验证失败。有关更多详细信息,请参阅“EntityValidationErrors”属性。
【发布时间】:2019-11-17 11:33:40
【问题描述】:

我将 Customer 和所有 MembershipTypes 从 Customer Controller 发送到 Edit 视图,因为我需要两者,如果你能告诉我如何在 VIEW 中而不是在 ViewBag.Message 中发送两者 以及为什么每次我编辑项目时我的应用都会抛出错误

我的客户类与membershipType 类具有多对一的关系:

 public class Customer
    {
        public Customer()
        {
            this.Movies = new HashSet<Movie>();
        }
        public int id { get; set; }
        [Required]
        [StringLength(255)]
        public String Name { get; set; }
        public bool IsSubscribedToNewsletter { get; set; }
        public int CurrentMembershipTypeId { get; set; }
        public MembershipType CurrentMembershipType { get; set;}
        public ICollection<Movie> Movies { get; set; }
    }

我的 MembershipType 类:

public class MembershipType
    {
        public int Id { get; set; }
        public short SignupFee { get; set; }
        public byte DurationInMonths { get; set; }
        public byte DiscountRate { get; set; }
        public ICollection<Customer> Customers { get; set; }

        // public virtual ICollection<Movie> Movie { get; set; }
    }

我的客户控制器:获取客户编辑的功能:

  public ActionResult Edit(int id)
        {
            Customer customer = new Customer();
            customer = iCustomerRepository.GetCustomerByID(id);
            var membershipTypes = iMembershipTypeRepository.GetMembershipTypes();
            ViewBag.Message = membershipTypes;
            return View(customer);
        }

客户编辑的发布操作:

[HttpPost]
        public ActionResult Edit(Customer customer)
        {
            Customer Customer = new Customer();
            Customer.id = customer.id;
            Customer.Name = customer.Name;
            Customer.IsSubscribedToNewsletter = customer.IsSubscribedToNewsletter;
            Customer.CurrentMembershipTypeId = customer.CurrentMembershipTypeId;
            iCustomerRepository.UpdateCustomer(Customer);
            iCustomerRepository.Save();
            return RedirectToAction("Customer");
        }

客户表单编辑视图:

<form action="/Customer/Edit" method="post">
    <table>
        <tr>
            <td>Id:</td>
            <td><label for="CustomerId">ID:</label></td>
            <td><input id="CustomerId" type="number" name="CustomerId" value="@Model.id" /></td>
        </tr>
        <tr>
            <td>Name:</td>
            <td><input id="CustomerName" type="text" name="CustomerName" value="@Model.Name" /></td>
        </tr>
        <tr>
            <td>IsSubscribedToNewLetter:</td>
            <td><input id="CustomerisSubscribedToNewsLetter" type="text" name="CustomerisSubscribedToNewsLetter" value="@Model.IsSubscribedToNewsletter" /></td>
        </tr>
        <tr>
            <td>MembershipType:</td>
            <td>
                <select id="MembershipTypeId" name="MembershipTypeId">
                    @foreach (var membershipType in @ViewBag.Message)
                    {
                        <option value=@membershipType.Id>
                            @membershipType.Id
                        </option>
                    }
                </select>
            </td>
        </tr>
    </table>
    <input type="submit" value="save" />
</form>

客户存储库类:

命名空间 WebApplication2.Repositories.CustomersRepositories

{

public class CustomerRepository : ICustomerRepository, IDisposable

{

    private CustomerContext context;



    public CustomerRepository(CustomerContext context)

    {

        this.context = context;

    }

    //public short GetMembershipTypeSignupFee()
    //{
    //    var Customers = context.Customers.ToList();
    //    foreach (var customer in Customers)
    //    {
    //       return  customer.CurrentMembershipType.SignupFee;
    //    }

    //}

    public IEnumerable<Customer> GetCustomers()

    {

        return context.Customers.ToList();

    }

    public Customer GetCustomerByID(int Id)

    {

        return context.Customers.Find(Id);

    }

    public void InsertCustomer(Customer customer)

    {

        context.Customers.Add(customer);

    }

    //public void InsertMany()

    //{

    //    context.Customers.AddRange(context.Customers);

    //}

    public void DeleteCustomer(int Id)

    {

        Customer customer = context.Customers.Find(Id);

        context.Customers.Remove(customer);

    }

    public void DeleteAllCustomers()

    {

        context.Customers.RemoveRange(context.Customers);

        context.SaveChanges();

    }

    public void UpdateCustomer(Customer customer)

    {

        context.Entry(customer).State = EntityState.Modified;

    }

    public void Save()

    {

        context.SaveChanges();

    }



    private bool disposed = false;

    protected virtual void Dispose(bool disposing)

    {

        if (!this.disposed)

        {

            if (disposing)

            {

                context.Dispose();

            }

        }

        this.disposed = true;

    }



    public void Dispose()

    {

        Dispose(true);

        GC.SuppressFinalize(this);

    }

}

}

【问题讨论】:

  • 错误出现的时间和地点?它是否在更新数据库期间出现?
  • EntityValidationErrors 说什么?
  • 它出现在客户存储库中 public void Save() { context.SaveChanges(); }
  • 当您在检查异常时调试时发生异常时,EntityValidationErrors 属性包含什么?这些信息是解决问题的关键。

标签: c# html asp.net-mvc razor


【解决方案1】:

由于您没有显示存储库方法,这是一个猜测。

iCustomerRepository.UpdateCustomer(Customer); 尝试添加一个新客户,但数据库正确地拒绝了它,因为具有给定 id 的记录已经存在。

存储库方法需要加载现有客户,然后更改其属性。顺便提一句。在存储库调用中使用SaveChanges 而不是控制器调用它是很常见的。

类似于以下内容。

var Upadate(Customer customer) {
    // Authorization code here maybe

    using( var context = ... ) {
       var dbCustomer = c.Customers.FirstOrDefault( c => c.Id = customer.id );
       if( dbCustomer == null ) throw new KeyNotFoundException("Customer not found!");
       dbCustomer.A = ...;
       dbCustomer.B = ...;


       context.SaveChanges();
}

我鼓励你使用以小写字母开头的变量名。

【讨论】:

  • 我在上面添加了CustoemrRepository 类。这可能会有所帮助
猜你喜欢
  • 1970-01-01
  • 2019-03-20
  • 2011-12-09
  • 1970-01-01
  • 2021-05-25
  • 2018-01-10
  • 2013-05-13
  • 2014-02-24
  • 1970-01-01
相关资源
最近更新 更多