wkololo_4ever: нет. Но если по правде...
Сохранил я данные в отдельный List из контекста, а потом извлек нужного мне Customer из этого List<> 100% эквивалентна вашему методу получения Customer через Attach(). 100%... Не важно от куда он, важно то, что он экземпляр Customer с достоверными данными. На счет моего кода - да, не спорю, ошибка в нем, но не в добавление, а в самих сущностях.
Vladimir S: вообще смысл в том, что главную роль тут играет Transaction. Как видно, у каждой транзакции есть кастомер. Ок. Если кастомера нет, я его ищу изначально по ФИО, то создается новый - new Customer { FIO } без ID.
В этом случае, при записи новой транзакции, я передаю информацию нового кастомера в самом транзакции. Ок.
Если кастомер есть, я его ищу изначально по ФИО, то я сохраняю его экземпляр в переменную. Сохранен он уже естественно с ФИО и с ID.
Опять же при записи новой транзакции, я указываю на этого кастомера (переменной), который существует.
wkololo_4ever: тоже самое что и было описано в самом вопросе. То же самое что и на скринах. Vladimir S предложил вариант. Он хоть как то изменяет поведение самой работы с БД. В принципе работает хуже, но все же более правильнее.
wkololo_4ever: на самом деле, все Customerы хранятся в переменных типа List. Именно из него я и ищу. А когда добавляю данные, я эти переменные обновляю и больше к контексту не притрагиваюсь пока опять не возникнет нужда добавить данные и обновить их.
Происходит что-то невероятное.
Если записей в Customers нет (и в Transactions естественно), то все ок!
По одной записи в каждой таблице при первой записи данных.
Если запись в Customers уже есть, то все равно создается новый Customers, но транзакции выглядят так
id|CustomerID|Price
1 1 5000
2 2 5000
3 2 1500
Это при том, что я всего два раза зачислил - 5000 и 1500 соответственно
Если тому же касту начислить еще 2000 то получится что в кастомерах появится третьй, а в транзикциях уже будет
Code First
class DbModel : DbContext
{
static DbModel()
{
Database.SetInitializer(new DropCreateDatabaseIfModelChanges());
}
public DbModel()
: base("Data Source=main.sdf") { }
public DbSet Customers { get; set; }
public DbSet Transactions { get; set; }
}
class Transaction
{
public int ID { get; set; }
public Customer Customer { get; set; }
public DateTime Date { get; set; }
public double Price { get; set; }
public int Discount { get; set; }
public double Ended { get; set; }
}
class Customer
{
public int ID { get; set; }
public string Name { get; set; }
public string Last { get; set; }
public string Other { get; set; }
Добавление в данных
Transaction trans = new Transaction { Customer = tempCust, Date = DateTime.Now, Discount = discount, Price = price, Ended = ended };
using (DbModel ctx = new DbModel())
{
ctx.Transactions.Add(trans);
ctx.SaveChanges();
}
Где tempCust либо new Customer() { Last = "Фамилия", Name = "Имя", Other = "Отчество" }
либо ctx.Customers.ToList().Find((DbCust) => { ищу по ФИО }
veitmen: да. проблема в том что Customer один и тот же создается.
cust создается либо с полями ФИО, без ID, если его в таблице нет. Если в таблице есть Customer, то передается экземпляр сущности этого Customer.
kybq: Ну... Во-первых: это утомляет. Вы просто будете уставать. Во-вторых: у вас не всегда будет настроение, чтобы сесть и учить.
В-третьих: это отрицательно сказывается на работе мозга. Помните, что мозг имеет ограниченный ресурс, ему нужен отдых. От перенапряжения мозг работает на износ и вся информация просто уйдет в никуда. Если перевести максимальную производительность мозг, а точнее именно понимание и запоминание, в книжный эквивалент, то получится 7 страниц. 7 страниц текста, который за день вы можете разобрать, понять и запомнить. Ночью только этот объем информации сохранится в долгосрочную память. Больше - хуже.
Если учитывать человеческие потребности (но не вдаваться в них), то книга на 1500 страниц отнимет у вас год времени (при самом хорошем раскладе).
kybq: Год это минимум. Да, при самостоятельном обучение. Стажировка - как получаться будет. Не будете же вы уделять 6-10 часов в день чистому изучению (если думаете, что сможете, то ошибаетесь). Если будут время и силы, то в под конец дня можно что-то сделать (строчек на 100 кода), но чисто для себя, то есть на месте обучения, без выхода на рынок .