Проблем с EF в WPF проект


1

 Здравейте. Опитвам се да подкарам проект на WPF с EF code first и Unit of Work, точнко както го правих с MVC.

 Обаче Seed метода в Configuration се вика всеки път като стартирам приложението! Изглежда ми странно, тъй като базата не се дропва и създава, а едни и същи данни се добавят всеки път. 

 Сякаш нещо не е наред с App.config на WPF проекта, тъй като дори и да изтрия connection string връзката пак с базата работи. Ако променя в него Name и създам наново базата, не взима името от там, а от конструктора на TownsAndCountriesDbContext() в Data проекта.

 Ще съм благодарен, ако някой може да открие проблема:

 Проект

 




Отговори



2

Здравей колега.

Според мен проблемът ти идва от това, че в "TownsAndCountries.DekstopClient" имаш connection string, но имаш разминаване при DbContext-а и connection string-а. Това ти е connection string-а:

<add name="DefaultConnection" connectionString="Data Source=.;Initial Catalog=TownsAndCountries_Db;Integrated Security=True" providerName="System.Data.SqlClient" />

А в конструктора на DbContext-а казваш:

public TownsAndCountriesDbContext() : base("TownsAndCountries_db")


"base("TownsAndCountries_db")" трябва да ти води към името на connection string-а, а не към initial catalog. В твоят случай името на connection string-а ти е: "DefaultConnection", така че просто смени ": base("TownsAndCountries_db")" на ": base("DefaultConnection")".

Възможните опции са две:
Или сменяш connection string-a и оставяш конструктора или сменяш стринга в конструктора и оставяш connection stringa. Тоест:
или

<add name="DefaultConnection" connectionString="Data Source=.;Initial Catalog=TownsAndCountries_Db;Integrated Security=True" providerName="System.Data.SqlClient" />

+

public TownsAndCountriesDbContext() : base("DefaultConnection")

или

<add name="TownsAndCountries_db" connectionString="Data Source=.;Initial Catalog=TownsAndCountries_Db;Integrated Security=True" providerName="System.Data.SqlClient" />

+

public TownsAndCountriesDbContext() : base("TownsAndCountries_db")

Надявам съм да съм успял да помогна.

Поздрави,
Николай!


от nikolaider (230 точки)


0

За да не ти добавя наново едни и същи данни, използвай AddOrUpdate вместо Add в Configuration.cs

За другото нямам идея.


от dilyantraykov (1005 точки)


0

 Здравейте. Благодаря за отговорите.

Успях да го оправя, като сложих "DefaultConnection" в конструктора на dbContext.

Обаче незнам защо като сменя името в connection string на нещо друго, става нещо крайно интересно - не мога да намеря къде се създава базата.

Има ли причина name да трябва да се казва винаги "DefaultConnection"?


от ivan.mihov1 (4988 точки)


1

Разбира се, че няма причина name винаги да има стойност "DefaultConnection". Каква ще е ползата от него изобщо, в такъв случай? Представи си го като една променлива, която просто съдържа един string(в случая - connection string). Чрез name ти създаваш променлива за всеки един от своите connection string-ове. Съответно, чрез 

public TownsAndCountriesDbContext() : base("TownsAndCountries_db")

ти оказваш да се използва connection string с име "TownsAndCountries_db", който в случая, ти нямаш.

Когато се опитваш да използваш име на connection string, който не съществува в App.config/Web.config, то базата се създава или в localdb, или като локален файл(но това е доста слабо вероятно в твоя сценарий). Използвай SSMS и вместо ".", в полето "Server name" въведи "(localdb)\v11.0" и провери дали откриваш базата си там.


от zhulien (785 точки)

1
Подкрепям всичко, което написа колегата. Искам да добавя, че ако си с sql server 2014 и искаш да се свържеш с localdb, въведи вместо "(localdb)\v11.0", това -> "(localdb)\MSSQLLocalDB"

от antoanelenkov (1047 точки)



1

Seed метода се изпълнява всеки път като стартираш апликацията(или по-точно, когато контекста се срещне за първи път в апп домейна).

public sealed class Configuration : DbMigrationsConfiguration<CodeFirst.Data.ForumContext> { private bool _pendingMigrations = false; public Configuration() { this.AutomaticMigrationsEnabled = true; this.AutomaticMigrationDataLossAllowed = true; var migrator = new DbMigrator(this); _pendingMigrations = migrator.GetPendingMigrations().Any(); } protected override void Seed(CodeFirst.Data.ForumContext context) { if (this._pendingMigrations == true) { context.Tags.AddOrUpdate(new Tag { Text = "срок" }); context.Tags.AddOrUpdate(new Tag { Text = "форум" }); } } }




0
 Благодаря, това обяснява всичко. Значи е различно спрямо Web Application-ите така ли? Там освен ако не съм забравил някоя специална настройка, seed-a се изпълняваше само при създаване на базата.

от ivan.mihov1 (4988 точки)

1
Ами най-вероятно ползваш database initializer в mvc апликациите си.Seed методите в database initializer и migration имат различно поведение.




0

 Здравейте.

Желая да попитам още нещо свързано с WPF.

Тук имам някаква проста програмка за ъплоудване на картинки. Картинките се записват в под-директория на проека, а пътищата в xml. Ъплоуда работи, но новата картинка се показва празна.

WPF показва само картинки, include-нати в проекта. Как може това да се промени? Опитах всякакви варианти...

Проект

- мисля, че промяната трябва да се направи в последния метод на този ViewModel


от ivan.mihov1 (4988 точки)