Entity Framework 4.1 не помещает данные в базу данных в SaveChanges () - PullRequest
1 голос
/ 03 октября 2011

У меня проблема при использовании новой Entity Framework 4.1. Я начал тестировать его несколько дней назад, и я все еще не знаком с концепцией POCO и этим новым API.

Во всяком случае, делая какое-то кодирование, я создал что-то вроде этого:

public Tag GetTagWithName(string name)
{
    if (db.Tags.SingleOrDefault(q => q.Name == name) == null)
    {

        return new Tag { Name = name };
    }
    else
    {
        return db.Tags.SingleOrDefault(q => q.Name == name);
    }
}

Что должно проверять в базе данных, существует ли тег с таким именем, и я использую эту функцию в этом фрагменте кода:

if (tags != null)
{
    foreach (HtmlNode tagNode in tags)
    {
        string tagString = tagNode.InnerText.Remove(0, 1);
        Tag tag = TagRep.GetTagWithName(tagString);
        pic.Tags.Add(tag);
    }
}
if (context.Pictures.Any(q => q.Link == pic.Link))
{
    continue;
}
else
{
    context.Pictures.Add(pic);
}
context.SaveChanges();

Что в основном добавляет теги к вновь созданным фотографиям, проверьте, есть ли фотография в базе данных, а затем, если нет, добавьте ее в базу данных, и вызывайте SaveChanges () после каждого изображения.

Ну, моя проблема в том, что во время выполнения функция GetTagWithName вызывает ошибку «Последовательность содержит более одного элемента» при получении «SingleOrDefault», что не должно происходить, потому что я проверяю всю базу данных перед добавлением любого нового тега, используя это Функция для проверки, если тег уже находится в БД.

Из того, что я увидел в своем коде, ситуация возникает из-за того факта, что даже если я добавлю к рисунку объект Tag, который я извлек из базы данных, он все же позже добавит его в качестве нового объекта в таблицу тегов. .

Есть ли какое-нибудь объяснение этому?

1 Ответ

3 голосов
/ 03 октября 2011

Несколько вещей. Во-первых, вы делаете это неправильно:

что не должно произойти, потому что я проверяю всю базу данных раньше добавив любой новый тег, используя эту функцию, чтобы проверить, является ли тег уже в БД.

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

Второе - ваш код не только неэффективен (вы дважды нажали на db), но и содержит ошибки. Вы сверяете имя с базой данных, допустим, что оно не существует, поэтому вы добавляете тег, затем проверяете то же имя, но оно все еще не существует, поэтому вы добавляете его снова!

Вы сохраняете его, а затем не можете получить одну запись, потому что вы только что сохранили 2 записи с одинаковым именем.

...