Имя Savechanges () не существует в текущем контексте в EF Core. - PullRequest
0 голосов
/ 16 июня 2020

Я переношу свой код с EF на EF Core. У нас есть общий репозиторий. И этот Igenericreposirory наследуется Genericreposirory.

IGenericreposirory

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Threading.Tasks;

namespace DataLayer.Repositories.Base
{
public interface IGenericRepository<T, TKey> where T : class
{
       T Add(T entity);
}
}

GenericRepository:

public class GeneralRepository<T, TKey> : IGenericRepository<T, TKey>
    where T : class, IEntity<TKey>, new()
 {
    protected readonly DbContext DbContext;
    internal DbSet<T> DbSet;

    public GeneralRepository(DbContext dbContext)
    {
        if (dbContext == null)
            throw new ArgumentNullException("dbContext");

        this.DbContext = dbContext;

        this.DbSet = this.DbContext.Set<T>();
    }

public virtual T Add(T entity)
    {
        #region Argument Validation

        if (entity == null)
        {
            throw new ArgumentNullException("entity");
        }

        #endregion

        var obj = DbSet.Add(entity);
        SaveChanges();
        return obj;
    }

}

Здесь я получаю 2 ошибки во время работы с ядром EF 1 при возврате obj как «Невозможно преобразовать из 'Microsoft.EntityFrameworkCore.ChangeTracking.EntityEntry' в 'T'»

2 в Savechange (), поскольку «имя savechanges ()» не существует в текущий контекст.

Насколько я знаю, ядро ​​EF поддерживает все методы для выборки, вставки, добавления

1 Ответ

0 голосов
/ 17 июня 2020

1 при возврате obj как «Невозможно преобразовать из 'Microsoft.EntityFrameworkCore.ChangeTracking.EntityEntry' в 'T'»

Подпись DbSet.Add() была изменена между EF6 и ядром EF. В EF6 он возвращал сам объект, см. Документацию DbSet.Add() in EF6:

public virtual TEntity Add (TEntity entity);

Но в ядре EF он был изменен, чтобы возвращать EntityEntry вместо этого см. документацию DbSet.Add() in EF core:

public virtual Microsoft.EntityFrameworkCore.ChangeTracking.EntityEntry<TEntity> Add (TEntity entity);

Таким образом, вам нужно вернуть значение EntityEntry.Entity свойство для получения отслеживаемого объекта (которое может быть таким же, как ваша переменная entity). Таким образом, код может выглядеть так:

var obj = DbSet.Add(entity);
// [...]
return obj.Entity;

2 в Savechange (), поскольку «имя savechanges ()» не существует в текущем контексте.

Вы пытаетесь вызвать метод SaveChanges(); в вашем классе GeneralRepository, но такой метод не определен. Однако у объекта DbContext есть такой метод . Вместо этого просто вызовите метод из DbContext:

var obj = DbSet.Add(entity);
this.Context.SaveChanges();
return obj.Entity;
...