ahmed_sa Ответов: 1

Когда вызывать методы getbyid метод, я получаю ошибку составного ключа если нажать первую кнопку на создание представления о ASP.NET ядро 2.1


Как решить эту ошибку и почему это происходит ?

An unhandled exception occurred while processing the request.
ArgumentException: Entity type 'Employee' is defined with a 2-part composite key, but 1 values were passed to the 'DbSet.Find' method.
Microsoft.EntityFrameworkCore.Internal.EntityFinder<TEntity>.FindTracked(object[] keyValues, out IReadOnlyList<IProperty> keyProperties)

Stack Query Cookies Headers
ArgumentException: Entity type 'Employee' is defined with a 2-part composite key, but 1 values were passed to the 'DbSet.Find' method.
Microsoft.EntityFrameworkCore.Internal.EntityFinder<TEntity>.FindTracked(object[] keyValues, out IReadOnlyList<IProperty> keyProperties)
Microsoft.EntityFrameworkCore.Internal.EntityFinder<TEntity>.Find(object[] keyValues)
Microsoft.EntityFrameworkCore.Internal.InternalDbSet<TEntity>.Find(object[] keyValues)
TabDataAccess.Repositories.RepositoryTab<T>.GetById(object Id) in RepositoryTab.cs
+
            return dbSet.Find(Id);
WebTabCore.Controllers.EmployeeController.Create(Nullable<int> id) in EmployeeController.cs
+
                model = _repository.GetById(id);



repository interface

public interface IrepositoryTab<T> where T : class
        {
             T GetById(object Id);
        }


repository implementaion

public class RepositoryTab<T> : IrepositoryTab<T> where T : class
    {
        protected TabDbContext db { get; set; }
        private DbSet<T> dbSet;

        public RepositoryTab(TabDbContext Tabdb)
        {
            db = Tabdb;
            dbSet = db.Set<T>();
        }
        public T GetById(object Id)
        {
            return dbSet.Find(Id);
        }
        }

public class Employee
    {
  
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int EmployeeId { get; set; }
        public int BranchCode { get; set; }
        public string EmployeeName { get; set; }

    }

modelBuilder.Entity<Employee>()
          .HasKey(t => new { t.EmployeeId, t.BranchCode });


Что я уже пробовал:

What I have tried:

public class EmployeeController : Controller
   {

       private readonly IrepositoryTab<Employee> _repository;
       public EmployeeController(IrepositoryTab<Employee> emp)
       {
           this._repository = emp;
       }

       public async Task<IActionResult> Create(int? id)
       {
           var model = new Employee();
           if (id != null)
           {

               model = _repository.GetById(id);


           }
           
      }
       public IActionResult First()
        {
            var employee = _repository.GetAll().FirstOrDefault();
            return RedirectToAction("Create", new { id = employee.EmployeeId});
        } 

on view create 

  <button id="BtnFirst" onclick="location.href='@Url.Action("First", "Employee",new { id = Model.EmployeeId})'" style="display:inline">First</button>

ahmed_sa

кто-нибудь может мне помочь, пожалуйста ?
Мне нужно передать ключ composit, чтобы получить идентификатор
но также у меня есть несколько таблиц с одним ключом
так что же мне делать пожалуйста

1 Ответов

Рейтинг:
2

Bohdan Stupak

Find фактически принять params[] таким образом, вы можете легко передать столько частей вашего составного ключа, сколько вам нужно.

public T GetById(int employeeId, int branchCode)
{
    return dbSet.Find(employeeId, branchCode);
}