Проблема с Entity Framework. C#

555
07 сентября 2017, 15:43

Всем привет, 3 вопроса:

1.такая проблема. EF последняя версия. Visual Studio. Создал простую базу данных. Создал модель. Создал таблицу. Через код добавляю в таблицу данные. Одну строчку он добавляет. Но вот как впишу еще одну например с названием "bu2" то уже ошибка на моменте db.SaveChanges();

System.Data.Entity.Infrastructure.DbUpdateException: "При обновлении записей возникла ошибка. Дополнительные сведения приведены во внутреннем исключении."

SqlException: Violation of PRIMARY KEY constraint 'PK__Buffet__3214EC070BE69470'. Cannot insert duplicate key in object 'dbo.Buffet'. The duplicate key value is (0). The statement has been terminated.

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

3.Почему в db. я уже нахожу свою таблицу во множественном числе с буквой s на конце?

class Program
{
    static void Main(string[] args)
    {
        Database1Entities db = new Database1Entities();
        var query = from t in db.Buffets select t;

        Buffet bu1 = new Buffet { MarketCap = 651616556, Index = "fesfs", 
        TotalDebt = 56156 };
        db.Buffets.Add(bu1);
        db.SaveChanges();
        foreach (var item in query)
        {
            Console.WriteLine(item.MarketCap);
        }
        Console.ReadKey();
    }
}

Вот так решается проблема, не хочет автоматом Id прописывать, но второй вопрос остается все еще открытым.

static void Main(string[] args)
{
    using (Database1Entities db1 = new Database1Entities())
    {
        Buffet bu1 = new Buffet { Id = 0, MarketCap = 651616556, Index = 
       "SP500", TotalDebt = 79994};
        Buffet bu2 = new Buffet { Id = 1, MarketCap = 657145, Index = 
       "Dow30", TotalDebt = 582166 };
        Buffet bu3 = new Buffet { Id = 2, MarketCap = 157212, Index = 
         "NASDAQ", TotalDebt = 1298974 };
        db1.Buffets.Add(bu1);
        db1.Buffets.Add(bu2);
        db1.Buffets.Add(bu3);
        db1.SaveChanges();
        var query = from t in db1.Buffets select t;
        foreach (var item in query)
        {
            Console.WriteLine(item.MarketCap);
            Console.WriteLine(item.TotalDebt);
        }
    }
    Console.ReadKey();
}

покажите как у вас объявлен Buffet.

PashaPash Если вы вот это имеете ввиду, то вот так:

 public virtual DbSet<Buffet> Buffets { get; set; }

Автоматом при создание модели генерирует.

что проверяете именно в той базе?

Захожу в таблицу Buffet, а там всюду null, после отладки не сохраняются данные.

как именно у вас база подключена?

Она подключена обычно:) не знаю как точно ответить. Создал простую базу в VS, создал модель. На ней зеленая розетка, но при запуске отладки загорается крестик красные, может она просто отключается на отладку. Нашел тут на форму ответ, что нужно поставить if newer в свойствах базы данных. Я та понял это в свойствах базы данных, у меня рус. версия. Как я понял это связано с "Копировать в выходной каталог", но переключая там на разные вкладки снова ошибка на SaveChages().

Answer 1

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

Вообще говоря, такое поведение по умолчанию - странное. Потому что EF умеет использовать автоинкрементные ключи, и свойство Id по умолчанию становится именно таковым.

Есть несколько предположений почему так может происходить.

  • Наиболее вероятно, что вы используете подход Database First, то есть вы сгенерировали модель по готовой базе данных. И в этой базе данных атрибут Id не был объявлен автоинкрементным (в терминах MS SQL Server - Identity). Сделайте его автоинкрементным и обновите модель.

  • За создание автоинкрементных полей в EF отвечает соглашение StoreGeneratedIdentityKeyConvention. Но оно работает только с типами Int16, Int32 и Int64 (они же - short, int и long). Возможно, ваше свойство Id имеет какой-то другой тип данных. В таком случае исправьте его на long и все заработает.

  • Также возможно, что EF по какой-то причине не использует соглашение StoreGeneratedIdentityKeyConvention. Это возможно если оно было явно удалено из списка используемых соглашений на этапе построения модели. Проверьте, нет ли у вас в классе контекста метода OnModelCreating с непонятными строчками.

  • Также на всякий случай привожу полный список условий, которые должны быть выполнены для того чтобы первичный ключ автоматически стал автоинкрементным:

    1. Сущность должна быть корнем иерархии (не должно быть базового класса, отображенного на БД).
    2. Эта иерархия не может быть типа TPC (Table per Concrete class)
    3. Первичный ключ должен состоять равно из одного свойства
    4. Это свойство должно быть типа Int16, Int32 или Int64
    5. У сущности не может быть других автоинкрементных свойств
    6. У ключевого свойства не должен быть явно указан никакой StoreGeneratedPattern
    7. Сущность не может разделять одну и ту же таблицу с другой сущностью

Существует возможность принудительно сделать свойство автоинкрементным ключом. Для этого надо использовать атрибут DatabaseGeneratedAttribute:

public class Buffet
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public long Id { get; set; }
    // остальные свойства
}

Тем не менее, условия из списка выше взялись не просто так, и лучше добиться их выполнения чем вот так давить силой - иначе могут "полезть" уже другие ошибки.

Answer 2
        db1.Buffets.Add(bu1);
        db1.Buffets.Add(bu2);
        db1.Buffets.Add(bu3);
        db1.SaveChanges();

Все три записи которые которые сохраняются при db1.SaveChages() обертываются в одну транзакцию , поэтому ошибка на одной Add(), вызывает откат всех предыдущих Add().

READ ALSO
Unity, C# перемещение камеры

Unity, C# перемещение камеры

Добрый деньНе могу как можно реализовать следующее перемещение: если нажата ЛКМ то перемещать камеру так как будто перемещаешь объект то есть...

336
DDD и справочные таблицы

DDD и справочные таблицы

Исходные условия:

384
ASP.NET CORE, не мигрируется база

ASP.NET CORE, не мигрируется база

Доброе время суток,есть проект, взятый он с офсайта :

334