Операция CRUD для .net-core web API с интерфейсами - saveChanges () не существует - PullRequest
0 голосов
/ 04 февраля 2019

Обзор

Я делаю веб-API .net-core с простыми операциями CRUD.

Я создал методы GET и запустил их, но при попытке реализоватьметод Create с использованием dbContext.Add (myItem) После этого я не могу использовать dbContext.SaveChanges ().

Моя текущая работа доступна по адресу: https://github.com/petermefrandsen/TKD-theory-API

Пока

Я попытался добавить метод перезаписи в контекст моей базы данных.Кроме того, я попытался добавить ссылку на структуру сущностей в проект.

Поскольку я использую интерфейсы для слабой связи, я не понимаю, когда сравнивать учебные пособия и другие подобные проблемы.(читай, я довольно новичок в c #).

Код

Контроллер:

[Route("dan/")]
[HttpPost]
public ActionResult<DanTheoryItem> PostDanTheoryItem(DanTheoryItem danTheoryItem)
{
    _context.PostDanTheoryItem(danTheoryItem);
    return new ActionResult<DanTheoryItem>(danTheoryItem);
}

IContext:

DanTheoryItem PostDanTheoryItem(DanTheoryItem danTheoryItem);

Контекст:

public DanTheoryItem PostDanTheoryItem(DanTheoryItem danTheoryItem)
{
    var theoryItem = new DbDanTheoryItems
    {
        Id = danTheoryItem.Id,
        KoreanTheoryItemId = danTheoryItem.KoreanTheoryItemId,
        MainCategory = danTheoryItem.MainCategory,
        SubCategory = danTheoryItem.SubCategory,
        SubToSubCategory = danTheoryItem.SubToSubCategory,
        NameLatin = danTheoryItem.NameLatin,
        NamePhonetic = danTheoryItem.NamePhonetic,
        NameAudio = danTheoryItem.NameAudio
    };
    _dbContext.DanTheoryItems.Add(theoryItem);
    //_dbContext.SaveChanges();
    return danTheoryItem;
}

Желаемый результат

Я бы хотел, чтобы контроллер вызывал методы контекста, которые будут записывать нужные данные в базу данных.

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Трудно сказать именно потому, что вы забыли опубликовать определенные ключевые части своего кода.Тем не менее, я думаю, что вам предоставляется «контекст» IDbContext (вашего собственного создания) вместо DbContext, и ваш интерфейс не определяет метод SaveChanges.

ЧестноПросто избавься от IDbContext.Задача интерфейса - определить контракт между несколькими реализациями.Здесь может быть только одна реализация: DbContext, а DbContext даже не знает об этом интерфейсе.Просто введите ваш производный DbContext напрямую.

Использование интерфейса не волшебная палочка.Здесь вы сильно зависите от Entity Framework, так что интерфейс или нет, вы тесно связаны.Это не обязательно плохо вещь, хотя.EF служит вашим уровнем данных, и это приложение управляется данными;он будет тесно связан с уровнем данных, несмотря ни на что.

Сам API служит вашей абстракцией.Предполагается, что другие уровни будут просто использовать API, поэтому дальнейшая абстракция не требуется, а на самом деле просто добавляет больше проблем с обслуживанием без каких-либо дополнительных преимуществ.

0 голосов
/ 04 февраля 2019

Ваш интерфейс не содержит метод SaveChanges.Поскольку вы используете внедрение зависимостей, для вашего контроллера будут доступны только методы в вашем интерфейсе.Если вы унаследуете от класса System.Data.Entity.IDbContext в своем пользовательском интерфейсе, метод будет представлен вам в вашем контроллере.

Создание экземпляра вашего класса DbLokisaurTKDTheoryAppContext в вашем контроллере представит метод SaveChanges какЧто ж.

...