5381.image_5F00_15922085

ASP.NET MVC3 + EF4.1 CodeFirst på Binero

Jag har gjort en sajt i ASP.NET MVC3 med EntityFramework 4.1 (magic unicorn edition) CodeFirst och publicerat den på webbhotellet Binero. Vad jag förstår är jag den första att göra det, och det kräver lite pillande att få det att fungera.

Det första problemet är att EF4.1 vill skapa en databas som heter som din DbContext. På Binero heter din databas något med ditt kundnummer först, och du kan inte döpa din DbContext till det. Jag misstänker att det beror på att ett klassnamn måste börja på en bokstav.

Lösningen på detta är att tvinga din DbContext att använda en ConnectionString. Man kan ju tycka att det borde vara en enkel match, och det är det när man vet hur man gör. Det krävdes en del sökande för att hitta lösningen, men här är den:

public MyDbContext() : base(“ConnectionStringName”)

Alltså, det jag gör är att se till att konstruktorn till min DbContext ärver av sig själv med namnet på din ConnectionString som parameter.

Nästa problem är att EntityFramework CodeFirst vill köra DropAndCreate på databasen när du förändrar strukturen på dina klasser. Binero stödjer inte detta (och antagligen inga andra webbhotell heller) och därför måste du få EntityFramework att istället bara återställa tabellerna. Nu finns det ingen sådan lösning out-of-the-box, men däremot finns det en att installera på NuGet.

Med den installerad ser klassen ut så här:

namespace MyProject.Models {
public class MyDbContext : DbContext
{
public MyDbContext() : base(“ConnectionStringName”)
{
System.Data.Entity.Database.SetInitializer(new DontDropDbJustCreateTablesIfModelChanged<MyProject.Models.MyDbContext>());
}
public DbSet<MyProject.Models.MyClass> Elephants { get; set; }
}
}

Så enkelt kan det vara när man vet hur man gör. Lycka till!

Sprid detta ordbajs vidare
Created by disruptive.nu
Related Posts Plugin for WordPress, Blogger...

About Ordbajsarn

Jag som kallar mig för Ordbajsarn heter egentligen Stefan Bergfeldt. Jag föddes på Falu lasarett i augusti 1978, och är uppväxt i Hedemora.Webbutvecklare, sökmotoroptimerare, entreprenör och gitarrist är andra saker man kan kalla mig, om inte Ordbajsarn passar. Jag driver konsultfirman CRS Webbproduktion, och har specialiserat mig på att ta fram kostnadseffektiva webblösningar till små- och medelstora företag.

  • http://blogg.binero.se Binero

    Finfin bloggpost Stefan!
    Vi har länkat till den i vår FAQ här: http://www.binero.se/support/faq/webbdatabas/aspnet/hur-anvander-jag-aspnet-mvc3-ef-41-codefirst
    Stort tack och vänliga hälsningar,
    Erik
    Binero

  • http://www.wedholm.net Kristoffer Wedholm

    Och där blev jag återigen påmind om att jag ska börja utforska ASP.NET. Hur som helst är det en ett bra blogginlägg som säkert kommer hjälpa många framöver.

  • http://www.berthilson.se/blogg/ Viktor

    Det där var grekiska för mig. Fortsätter att hålla min dröm vid liv om att lära mig php istället =)

  • Fredrik Kuylenstierna

    Kan du ge ett exempel på hur connectionstring;en ska se ut? jag förstår inte riktigt hur man kan sätta metadata utan att ha tillgång till “.csdl”-, “.ssdl”-,”.msl”-filerna såsom det anges här: http://msdn.microsoft.com/en-us/library/bb896291.aspx

    Tacksam för hjälpen.

    // Fredrik

    • Anonymous

      Hej! Nu tänkte jag be om ursäkt för sent svar, men så inser jag själv att ett par timmar faktiskt är ganska snabbt ändå.

      Så här ser min connectionstring ut:
      connectionString=”Data Source=********.mssql.binero.se; Initial Catalog=********; Persist Security Info=True; User ID=********; Password=********”

      Det fungerar alldeles utmärkt så, fast du får ju byta ut alla * mot dina personliga värden. ;)

      • Fredrik Kuylenstierna

        Ja, det dröjde minsann inte länge =)

        Tack för svaret! Ska testa så fort tid ges.

  • Anonymous

    Tack Stefan, riktigt stökigt det där! 

    Men jag undrar vad som egentligen är best practise som datamodell för MVC3. EF 4.x känns riktigt scary när man håller på. Helt underbart när man är i första utvecklingsskedet om man kör CodeFirst eller ModelFist dvs. Men sen när man skeppat ut det i produktion och går in i förvaltning. Är jäkligt rädd för att man blåser all produktions data,  efter ett år eller så om man ändrar schemat. Man kan ju inte scripta ut data varje gång, låter lite hål i huvudet. Vet någon om man ska vara lugn gällande den saken? Spontant känns linqToSQL bättre, synd att utv. avtog där!
    Mvh Abbe

  • http://www.facebook.com/profile.php?id=644727125 Michael Roesler

    Funkar det att implementera detta på aspnet.mdf databasen som finns i mvc3?