Всем привет, 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().
Проблема с дублирующимся первичным ключом возникает когда, сюрприз, первичный ключ дублируется. Вы значение ключа не указали, там лежит ноль - вот EF и пытается вставить этот ноль в таблицу три раза.
Вообще говоря, такое поведение по умолчанию - странное. Потому что EF умеет использовать автоинкрементные ключи, и свойство Id по умолчанию становится именно таковым.
Есть несколько предположений почему так может происходить.
Наиболее вероятно, что вы используете подход Database First, то есть вы сгенерировали модель по готовой базе данных. И в этой базе данных атрибут Id не был объявлен автоинкрементным (в терминах MS SQL Server - Identity). Сделайте его автоинкрементным и обновите модель.
За создание автоинкрементных полей в EF отвечает соглашение StoreGeneratedIdentityKeyConvention. Но оно работает только с типами Int16, Int32 и Int64 (они же - short, int и long). Возможно, ваше свойство Id имеет какой-то другой тип данных. В таком случае исправьте его на long и все заработает.
Также возможно, что EF по какой-то причине не использует соглашение StoreGeneratedIdentityKeyConvention. Это возможно если оно было явно удалено из списка используемых соглашений на этапе построения модели. Проверьте, нет ли у вас в классе контекста метода OnModelCreating с непонятными строчками.
Также на всякий случай привожу полный список условий, которые должны быть выполнены для того чтобы первичный ключ автоматически стал автоинкрементным:
Существует возможность принудительно сделать свойство автоинкрементным ключом. Для этого надо использовать атрибут DatabaseGeneratedAttribute:
public class Buffet
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long Id { get; set; }
// остальные свойства
}
Тем не менее, условия из списка выше взялись не просто так, и лучше добиться их выполнения чем вот так давить силой - иначе могут "полезть" уже другие ошибки.
db1.Buffets.Add(bu1);
db1.Buffets.Add(bu2);
db1.Buffets.Add(bu3);
db1.SaveChanges();
Все три записи которые которые сохраняются при db1.SaveChages() обертываются в одну транзакцию , поэтому ошибка на одной Add(), вызывает откат всех предыдущих Add().
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости