Entity Framework 7 kein Datenbankanbieter konfiguriert => wenn Migrationen in ein anderes Projekt verschoben werden




 Ich bin neu in EF7. Ich weiß, das ist eine doppelte Frage an: 

 [Es sind keine Datenbankanbieter EF7 konfiguriert](https://stackoverflow.com/questions/33070086/no-database-providers-are-configured-ef7) 

 Aber warten Sie, bevor Sie diese Frage geschlossen haben wollen ... und lesen Sie weiter 


```
 services.AddEntityFramework()
         .AddSqlServer()
         .AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));

 services.AddIdentity<ApplicationUser, IdentityRole>()
         .AddEntityFrameworkStores<ApplicationDbContext>()
         .AddDefaultTokenProviders();

  services.AddScoped<TestRepository, TestRepository>();

```
  Jetzt führe ich den Befehl dnx ef database update für die cmd-Fenster in meinem EF-Projekt aus und erhalte diesen Fehler: 


```
C:\TGB.DataAccess>dnx ef database update
System.InvalidOperationException: No database providers are configured. Configure a database provider by overriding OnConfiguring in your DbContext class or in the AddDbContext method when setting up services.
   bei Microsoft.Data.Entity.Internal.DatabaseProviderSelector.SelectServices(ServiceProviderSource providerSource)
   bei Microsoft.Data.Entity.Internal.DbContextServices.<>c__DisplayClass6_0.<Initialize>b__0()
   bei Microsoft.Data.Entity.Internal.LazyRef`1.get_Value()
   bei Microsoft.Data.Entity.Internal.DbContextServices.get_DatabaseProviderServices()
   bei Microsoft.Extensions.DependencyInjection.EntityFrameworkServiceCollectionExtensions.<>c.<AddEntityFramework>b__0_8(IServiceProvider p)
   bei Microsoft.Extensions.DependencyInjection.ServiceLookup.FactoryService.Invoke(ServiceProvider provider)
   bei Microsoft.Extensions.DependencyInjection.ServiceProvider.ScopedCallSite.Invoke(ServiceProvider provider)
   bei Microsoft.Extensions.DependencyInjection.ServiceProvider.<>c__DisplayClass12_0.<RealizeService>b__0(ServiceProvider provider)
   bei Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(Type serviceType)
   bei Microsoft.Extensions.DependencyInjection.ServiceProviderExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
   bei Microsoft.Extensions.DependencyInjection.ServiceProviderExtensions.GetRequiredService[T](IServiceProvider provider)
   bei Microsoft.Data.Entity.Design.Internal.DesignTimeServicesBuilder.Build(DbContext context)
   bei Microsoft.Data.Entity.Design.MigrationsOperations.UpdateDatabase(String targetMigration, String contextType)
   bei Microsoft.Data.Entity.Commands.Program.Executor.<>c__DisplayClass7_0.<UpdateDatabase>b__0()
   bei Microsoft.Data.Entity.Commands.Program.Executor.Execute(Action action)
No database providers are configured. Configure a database provider by overriding OnConfiguring in your DbContext class or in the AddDbContext method when setting up services.

```
  Jetzt habe ich versucht, den Konstruktor meines `ApplicationDbContext` entsprechend dem Lösungslink zu ändern, den ich oben eingefügt habe: 

 Das ist mein Code: 

 **Meine ApplicationDbContext.cs ist eigentlich leer, was bedeutet, dass ich nichts außer Kraft gesetzt habe.** 

 Betrachtet man die Basisklasse der Basisklasse, gibt es den überladenen Konstruktor mit dem Parameter DbContextOptions, aber ich kann nichts von meinem Konstruktor übergeben ?! 


```
  //
        // Summary:
        //     Initializes a new instance of Microsoft.AspNet.Identity.EntityFramework.IdentityDbContext.
        //
        // Parameters:
        //   options:
        //     The options to be used by a Microsoft.Data.Entity.DbContext.
        public IdentityDbContext(DbContextOptions options);

```
  Was ist an meiner Seite kaputt? Ich benutze EF 7 RC1 und DNX 451. 

 **Dies geschieht nur, wenn Sie den ApplicationDbContext / ApplicationUser und den gesamten Migrations-Ordner in ein zusätzliches "DataAccess" -Projekt verschieben. Dann scheint alles kaputt zu sein.**
1. Erstellen Sie eine neue ASP.NET-Webanwendung mit dem Namen "WebProject" mithilfe der Webanwendungsvorlage (Authentifizierung: Benutzerkonto).
2. Fügen Sie der Lösung mit dem Namen "DataAccess" ein weiteres Projekt hinzu (sagen wir Klassenbibliotheksart, obwohl diese nicht relevant ist)
3. Verschieben Sie jetzt den Ordner ApplicationDbContext / ApplicationUser files & migrations in das DataAccess-Projekt.
4. In diesem Stadium wird die Erstellung fehlschlagen, daher müssen wir die project.json für korrekte Referenzen korrigieren.
5. Fügen Sie für DataAccess-Projekt folgende Abhängigkeiten hinzu 


```
"dependencies": {
    "Microsoft.AspNet.Identity.EntityFramework": "3.0.0-rc1-final",
    "EntityFramework.MicrosoftSqlServer": "7.0.0-rc1-final"
}

```
6. Fügen Sie für WebProject `DataAccess` als Abhängigkeit hinzu. Da `DataAccess` auf zwei Pakete verweist, können Sie diese Referenzen aus WebProject entfernen.   
 Build sollte nun erfolgreich sein und Sie können eine Webanwendung starten.

 So verwenden Sie ef-Migrationen: 

 Wechseln Sie in der Befehlszeile in das Verzeichnis von WebProject (und nicht das DataAccess-Projekt). Alle ef-Befehle funktionieren von hier aus gut. 

 Um neue Migrationen zum Migrationsordner des DataAccess-Projekts hinzuzufügen, müssen Sie die Option `-p` verwenden. Mögen,   
 `dnx ef migrations add Sample -p DataAccess` . 

 Das Problem tritt auf, weil die Befehle von cmd im DataAccess-Projekt ausgeführt werden. Ihre Startup-Klasse, die alle Dienste initialisiert, befindet sich in WebProject. Wenn Sie versuchen, Befehle aus dem DataAccess-Verzeichnis auszuführen, wird `dnx ef` erkannt, da auf `EntityFramework.Commands` verwiesen wird. Wenn Sie jedoch versuchen, die Migrationen zu verwenden, werden Dienste nicht initialisiert. Daher wird das Überschreiben der Ausnahme fehlschlagen.
Sie können verwenden 


```
DbConfiguration.SetConfiguration(new YourDbConfiguration());

```
  Sie können also Ihre Konfiguration verwenden, ohne ein Attribut zu verwenden. 

 Aber wenn ich benutze 


```
public CeDbConfiguration()
{
 SetDefaultConnectionFactory(new SqlCeConnectionFactory(SqlCeProviderServices.ProviderInvariantName,
                                                        @"c:\test",
                                                        @"c:\test\db.sdf"));
SetProviderServices(SqlCeProviderServices.ProviderInvariantName,
                    SqlCeProviderServices.Instance);
}

```
  Um eine SQL CE Factory zu konfigurieren, wird der Pfad *'C: \ test'* ignoriert und ich muss auch Database.DefaultConnectionFactory setzen !! Der Grund für das Problem war ein Fehler in der Effort-Datenbank. Wenn die berechnete Spalte auf nicht nullwertfähigen Spalten basiert, kann die berechnete Spalte auch automatisch nicht nullwertfähig werden. Daher erwartete die Effort-Datenbank einen Wert ungleich Null. Mit dem neuesten Update ist das Problem behoben. Sie müssen das globale `EntityFrameworkEffortManager.UseDefaultForNotNullable` Flag auf true setzen. 

 Siehe die [Ausgabe auf Github](https://github.com/zzzprojects/EntityFramework-Effort/issues/62#issuecomment-471199839) <p>es ist eine einschränkung des dbms - soweit ich weiß in allen. und das nicht nur beim hinzufügen einer spalte, sondern auch beim neuanordnen von spalten. wenn wir eine <code>unique</code> -einschränkung für <code>(a1, a2)</code> haben, können wir keine <code>foreign key</code> hinzufügen, die <code>references (a2, a1)</code>, es sei denn, es gibt eine eindeutige einschränkung für diese <code>(a2, a1)</code> das ist im wesentlichen redundant.</p><p>es wäre nicht besonders schwierig, dies als feature hinzuzufügen:</p><blockquote> <p>wenn es eine <code>unique</code> -einschränkung für <code>(a)</code> gibt, ist auch jede <code>(a, b, c, ..., z)</code> oder <code>(b,c, ...a, ...z)</code> kombination garantiert <code>unique</code>.</p> </blockquote><p>oder die verallgemeinerung:</p><blockquote> <p>wenn für <code>(a1, a2, ..., an)</code> eine <code>unique</code> -einschränkung besteht, ist auch jede <code>(a1, a2, ..., an, b1, b2, ..., bm)</code> - kombination oder neuanordnung <code>unique</code> garantiert.</p> </blockquote><p>es scheint, dass es nicht gefragt wurde oder nicht als hoch genug eingestuft wurde, um implementiert zu werden.</p><p>sie können jederzeit - im jeweiligen kanal - eine anfrage für die zu implementierende funktion stellen. oder implementieren sie es sogar selbst, wenn das dbms open source ist, wie postgres.</p> <p>die tastaturkombination, nach der sie suchen (<kbd>ctrl</kbd>+<kbd>k</kbd>, <kbd>ctrl</kbd>+<kbd>d</kbd>) dient der "formatierung" - aber nicht in dem maße, wie sie es zu erwarten scheinen. es ist kein prettifier, sondern dient nur zum einfügen korrekter abstände und tabulatoren wie in <code>tools &gt; options &gt; text editor &gt; transact-sql &gt; general/tabs</code>. wenn sie also einen teil des texts markieren und die tastaturkombination drücken, werden tabulatoren in 4 leerzeichen konvertiert ( wenn sie leerzeichen einfügen ausgewählt haben, wenden sie die von ihnen angegebene art des einrückens usw. an.</p><p>diese option soll den code nicht lesbarer machen. dies ist keine funktionalität, die management studio derzeit nativ bietet. es gibt zwar mehrere optionen von drittanbietern - einige befinden sich außerhalb von management studio, z.</p><ul> <li> <a href="http://extras.sqlservercentral.com/prettifier/prettifier.aspx">sql prettifier von simple-talk</a> </li> <li> <a href="http://poorsql.com/">schlechtes sql</a> (welches <a href="https://dba.stackexchange.com/a/45052/1186">thomas schlug vor</a> )</li> </ul><p>außerdem gibt es add-ins für verschiedene ebenen der formatierungsunterstützung im editor:</p><ul> <li> <a href="http://www.red-gate.com/products/sql-development/sql-prompt/features">sql-eingabeaufforderung von red-gate</a> </li> <li> <a href="http://ssmstoolspack.com/features?f=4">ssms tools pack</a> </li> <li> <a href="http://www.apexsql.com/sql\_tools\_refactor.aspx">apexsqls refactor</a> </li> <li> <a href="http://www.ssmsboost.com/features/ssms-add-in-format-sql-document">ssmsboost</a> </li> <li> <a href="http://www.devart.com/dbforge/sql/sqlcomplete/">dbforge sql complete</a> (welches <a href="https://dba.stackexchange.com/a/45063/1186">robert schlug vor</a> )</li> </ul><p>nun, der grund, warum sie die nachricht erhalten ...</p><blockquote> <p>die tastenkombination (strg + k, strg + d) ist an den befehl (format format) gebunden, der derzeit nicht verfügbar ist.</p> </blockquote><p>... liegt daran, dass ssms diese tastenkombination einem anderen kontext zugeordnet hat. die art und weise, wie sie <em> sollten</em> in der lage sein, dies zu "beheben" - auch hier würde es immer noch nicht das tun, was sie möchten, selbst wenn das "beheben" funktioniert - ist wie folgt:</p><ol> <li>gehe zu <code>tools &gt; options &gt; environment &gt; keyboard</code></li> <li>platzieren sie ihren cursor in das feld <code>press shortcut keys:</code></li> <li>schlagen <kbd>ctrl</kbd>+<kbd>k</kbd>, <kbd>ctrl</kbd>+<kbd>d</kbd></li> <li> <p>ändern sie das dropdown-menü <code>shortcut currently used by:</code> von <code>datawarehouse designer</code> in <code>text editor</code>.</p> <p><img src="https://i.stack.imgur.com/1g5oe.png" alt="enter image description here"></p> </li> <li> <p>drücke ok</p> </li> </ol><p>dies ist <em> angenommen</em>, um die tastaturkombination dem texteditor zuzuordnen, aber management studio setzt sie zurück, nachdem sie auf ok geklickt haben (sie erhalten weiterhin die fehlermeldung. ich denke, das problem ist das die dokumentation geht davon aus, dass diese funktionalität vorhanden ist, aber management studio weiß es besser und bietet sie einfach nicht an (und microsoft wird dies wahrscheinlich als fehler in der dokumentation abschreiben und korrigieren, anstatt als mangel im tool) hoffe in der zukunft, aber vorerst <a href="http://connect.microsoft.com/sql/feedback/viewfeedback.aspx?feedbackid=496617">dies ist ein bekanntes und weitgehend ignoriertes problem</a> . sie werden feststellen, dass die registerkarte <code>formatting</code> diese <a href="http://msdn.microsoft.com/en-us/library/ms174205(sql.110).aspx">die dokumentation bezieht sich auf</a> ist einfach nicht vorhanden (obwohl es für xml vorhanden ist, wo die tastaturkombination funktioniert). in der dokumentation sollte wahrscheinlich folgendes angegeben werden:</p><blockquote> <p>wendet die einrückungs- und leerzeichenformatierung für die sprache an, die im bereich <strong> formatierung </strong> der sprache im texteditor <strong> angegeben ist </strong> abschnitt des dialogfelds <strong> optionen </strong>. nur im texteditor verfügbar <strong> <em> und nur für bestimmte sprachen</em> </strong>.</p> </blockquote><p>eine andere möglichkeit, sich ein bild davon zu machen, welche art von formatierungsoptionen ssms nativ bietet, besteht darin, unter <code>tools &gt; customize &gt; commands &gt; edit &gt; add command... &gt; format</code> die liste der möglichen befehle dort anzuzeigen. nichts, was darauf hinweist, dass kenntnisse der tatsächlichen sprache vorhanden sind, sodass nicht bekannt ist, wo zeilenumbrüche eingefügt oder zusätzliche einrückungen hinzugefügt oder klammern usw. verwendet werden sollen.</p><p><img src="https://i.stack.imgur.com/zhrer.png" alt="enter image description here"></p><p>wenn sie eine sprachspezifische formatierung wünschen, um den vorhandenen t-sql-code besser lesbar zu machen, erhalten sie von ssms nicht viel, und sie müssen nach anderen optionen suchen.</p> <p>seit dem wahnsinn, der <a href="http://drupal.org/node/1092444">http://drupal.org/node/1092444</a> war, hat sich viel geändert. glücklicherweise ist das theming und festlegen von anzeigeformatierern für dateientitäten jetzt viel einfacher und unkomplizierter.</p><p><strong> die folgende dokumentation bezieht sich auf media 2.x und file entity </strong>, obwohl ein großteil davon mit media 1.x mit geringfügigen änderungen funktioniert (z. b. in media 1) .x, der link zur seite "dateitypen" befindet sich in konfiguration statt struktur).</p><h1>anzeigen von medien</h1><p>die module <a href="http://drupal.org/project/file\_entity">file entity</a> und <a href="http://drupal.org/project/media">media</a> arbeiten zusammen, um eine einheitliche methode zum speichern, verwalten und anzeigen von medien in drupal bereitzustellen. sie ermöglichen es einem benutzer, dateifelder zu erstellen, die zum speichern und anzeigen vieler verschiedener medientypen konfiguriert werden können, einschließlich bilder, video und audio. unter anderen. um diese verschiedenen medientypen anzuzeigen, benötigen dateifelder formatierer, die häufig von dem modul bereitgestellt werden, das den medientyp bereitstellt, und eine zusätzliche konfiguration.</p><h2>definitionen</h2><p>ich werde zuerst einige der beweglichen teile erklären und dann die anzeige von dateien auf einer site anpassen.</p><h3>datentypen</h3><p>dateien werden in <em> dateitypen</em> gruppiert. jeder dateityp wird durch eine liste von <a href="http://en.wikipedia.org/wiki/internet\_media\_type">mime-typen</a> definiert, eine universelle methode zur angabe von dateiformaten im internet. die standarddateitypen sind anwendung, audio, bild, text, video und andere. derzeit gibt es keine möglichkeit, neue dateitypen in der benutzeroberfläche zu definieren.</p><h3>modi anzeigen</h3><p>ansichtsmodi werden verwendet, um drupal 7 (und bald 8)) mitzuteilen, dass sich ein inhalt in einem bestimmten kontext befindet. der inhalt kann dann so geändert oder angezeigt werden, dass er am besten zu diesem kontext passt. zwei ansichtsmodi, mit denen die meisten menschen wahrscheinlich vertraut sind, sind der standard-teaser <strong> </strong> und <strong> full </strong>. -) modi benutzerdefinierte ansichtsmodi können mit modulen wie <a href="http://drupal.org/project/entity\_view\_mode">entity view-modus</a> , <a href="http://drupal.org/project/ds">display suite</a> oder in einer <a href="http://drupal.org/node/1026790#comment-4667062">benutzerdefiniertes modul</a> mit <a href="http://api.drupal.org/api/drupal/modules!system!system.api.php/function/hook\_entity\_info\_alter/7"><code>hook\_entity\_info\_alter()</code></a> .</p><h2>the good stuff oder: verwalten der anzeige ihres dateifelds</h2><p>die anzeige eines dateifelds wird nach <strong> dateityp </strong> verwaltet. navigieren sie zu struktur -&gt; dateitypen. sie sehen eine liste der verfügbaren dateitypen mit links zu "felder verwalten", "anzeige verwalten" und "dateianzeige verwalten".</p><h3>felder verwalten</h3><p>das modul "dateieinheit" macht alle dateien vollständig zu feldfähigen entitäten, genau wie knoten und taxonomiebegriffe. genau wie im abschnitt "inhaltstypen" können sie jedem dateityp benutzerdefinierte felder hinzufügen.</p><h3>anzeige verwalten</h3><p>wie unter "inhaltstypen" können sie auch hier die anzeige benutzerdefinierter felder für jeden dateityp verwalten. <strong> dieser abschnitt steuert nicht die formatierung der dateien selbst </strong>, sondern nur die anzeige der felder, die an die dateientität angehängt sind.</p><p>in diesem abschnitt sehen sie auch einen schalter für "benutzerdefinierte anzeigeeinstellungen". im erweiterten zustand können sie die für diese entität verfügbaren ansichtsmodi aktivieren und deaktivieren. <strong> hier muss ein ansichtsmodus aktiviert sein, damit er unter "dateianzeige verwalten" verfügbar ist. </strong> derzeit wird empfohlen, nur benutzerdefinierte ansichtsmodi zu verwenden vom benutzer definiert und die folgenden standardansichtsmodi; der rest bleibt von der styles-modulintegration übrig <a href="http://drupal.org/node/1051090">und wird schließlich entfernt</a> :</p><ul> <li>"teaser" (derzeit standardmäßig nicht enthalten. sie können ihn mit dem patch in der obigen ausgabe hinzufügen oder als benutzerdefinierten ansichtsmodus definieren.)</li> <li>"voll"</li> <li>"vorschau" (wird in administratorkontexten verwendet, z. b. für platzhalter in wysiwyg-feldern, im medienbrowser und im medienfeld-widget.)</li> </ul><h3>dateianzeige verwalten</h3><p><strong> in "dateianzeige verwalten" können sie formatierer für ihre dateitypen konfigurieren </strong> (ja!). viele media provider-module fügen hier ihre eigenen formatierer hinzu. beispielsweise bieten media: youtube und media: vimeo die formatierer "preview image" und "video".</p><p>formatierer können für jeden ansichtsmodus aktiviert und konfiguriert werden, der im abschnitt "anzeige verwalten" ihres dateityps aktiviert ist. beispielsweise möchte ein benutzer möglicherweise ein media: vimeo-vorschaubild anzeigen, wenn ein knoten als teaser angezeigt wird, das vimeo-video, wenn der vollständige knoten angezeigt wird, und ein video mit unterschiedlichen formatierungseinstellungen für breite und höhe, wenn der knoten mit angezeigt wird ein benutzerdefinierter ansichtsmodus namens "videogalerie". bei vielen formatierern (insbesondere "bild") kann der benutzer die bildstile auswählen, die er unter konfiguration -&gt; bildstile definiert hat.</p><p>da mehrere medienanbieter dasselbe feld verwenden können, sind die formatierer in einer kaskade von oben nach unten angeordnet. drupal verwendet den ersten formatierer, der auf die ausgabe eines felds angewendet werden kann. wenn ein videofeld die dateitypen "medien: youtube-video", "medien: vimeo-video" und "großer dateityp" aktiviert symbol "formatierer für den ansichtsmodus" voll ", drupal verwendet den youtube-formatierer, wenn der mime-typ der datei <code>video/youtube</code> ist, den vimeo-formatierer, wenn der mime-typ <code>video/vimeo</code> und greifen sie auf das große dateitypsymbol zurück, wenn der mime-typ <code>video/{anything else}</code> ist.</p><h3>konfigurieren des dateifelds für die anzeige mithilfe der einstellungen für "dateianzeige verwalten"</h3><p>damit das dateifeld mit den unter "dateianzeige verwalten" definierten formatierern angezeigt wird, muss es so eingestellt sein, dass die "gerenderte datei" angezeigt wird. navigieren sie zur seite "anzeige verwalten" für den <em> inhaltstyp</em>, der ihr dateifeld enthält. wählen sie "gerenderte datei" als format des dateifelds für alle ansichtsmodi, in denen sie die unter "dateianzeige verwalten" definierten formatierer verwenden möchten.</p><h2>weiteres theming</h2><p>mit <em> überschreibungen von themen-hooks</em> können sie benutzerdefinierte designfunktionen und vorlagendateien für noch mehr kontrolle erstellen. die vom modul "dateieinheit" bereitgestellten themenvorschläge lauten wie folgt:</p><pre><code>file\_\_{file type} file\_\_{file type}\_\_{view mode} file\_\_{mime type} file\_\_{mime type}\_\_{view mode} file\_\_{file id} file\_\_{file id}\_\_{view mode} </code></pre><p>ersetzen sie alle '/' und '\_\_' in mime-typen durch '\_' für themenfunktionen und '-' für vorlagendateien.</p><p>einige media provider-module ersetzen diese durch eigene vorlagen und vorschläge für themen-hooks. sie können alle verfügbaren themen-hook-vorschläge mit dem modul devel <a href="http://drupal.org/project/devel\_themer">theme developer</a> , mothership's <a href="http://drupal.org/node/1536664">poor themer's helper</a> oder hoffentlich in den dokumenten des anbieters einsehen für mehr information.</p><h2>outro</h2><p>hoffe das hilft. ich habe vor, dies zur mediendokumentation hinzuzufügen. wenn ich also etwas verpasst habe, irgendwo falsch geschrieben habe oder ein abschnitt einer klärung bedarf, lassen sie es mich bitte wissen.</p><p>und einige kurze antworten auf die spezifischen fragen des op:</p><ul> <li>media 1.x vs 2.x: obwohl 2.x instabil ist, ist es genauso zuverlässig wie viele stabile versionsmodule auf drupal.org. ich denke, es lohnt sich, sie für die stark verbesserten funktionen zu verwenden, aber weil in der problemwarteschlange so viel arbeit an der unterstützung geleistet wird, ist dies langsam und wie bei jedem entwicklungszweig können neue updates ihre implementierung beschädigen. trotzdem benutze ich es für die produktion.</li> <li>medien sind in entwicklung. einige dinge funktionieren noch nicht so, wie sie es sich erhoffen würden (z. b. wysiwyg-integration ohne image). aber es funktioniert immer noch besser als die kombination von modulen, die sie installieren müssen, um das zu tun, was es ohne es tut. und es wird besser.</li> </ul> <p>sie laufen <code>rake db:create</code> einmal und nur einmal, und sie führen es zuerst aus. dann führen sie <code>rake db:migrate</code> jedes mal, wenn sie eine migration hinzufügen/ändern. entweder haben sie diese migration bereits ausgeführt oder sie verweisen auf eine datenbank, die bereits vorhanden ist und eine tabelle mit dem namen <code>users</code> enthält. ich vermute, sie haben die migration bereits einmal durchgeführt. in diesem fall können sie wahrscheinlich loslegen. wenn sie die datenbank entpacken und von vorne beginnen möchten, tun sie <code>rake db:drop db:create db:migrate</code>.</p> <p>einfach. hier ist das beispiel aus meinem kopf:</p><h1>die oberste ebene <code>cmakelists.txt</code>:</h1><pre><code>cmake\_minimum\_required(version 2.8.10) # you can tweak some common (for all subprojects) stuff here. for example: set(cmake\_disable\_in\_source\_build on) set(cmake\_disable\_source\_changes on) if ("${cmake\_source\_dir}" strequal "${cmake\_binary\_dir}") message(send\_error "in-source builds are not allowed.") endif () set(cmake\_verbose\_makefile on) set(cmake\_color\_makefile on) # remove 'lib' prefix for shared libraries on windows if (win32) set(cmake\_shared\_library\_prefix "") endif () # when done tweaking common stuff, configure the components (subprojects). # note: the order matters! the most independent ones should go first. add\_subdirectory(components/b) # b is a static library (depends on boost) add\_subdirectory(components/c) # c is a shared library (depends on b and external xxx) add\_subdirectory(components/a) # a is a shared library (depends on c and b) add\_subdirectory(components/executable) # executable (depends on a and c) </code></pre><h1><code>cmakelists.txt</code> in <code>components/b</code>:</h1><pre><code>cmake\_minimum\_required(version 2.8.10) project(b c cxx) find\_package(boost 1.50.0 required) file(glob cpp\_files source/*.cpp) include\_directories(${boost\_include\_dirs}) add\_library(${project\_name} static ${cpp\_files}) # required on unix os family to be able to be linked into shared libraries. set\_target\_properties(${project\_name} properties position\_independent\_code on) target\_link\_libraries(${project\_name}) # expose b's public includes (including boost transitively) to other # subprojects through cache variable. set(${project\_name}\_include\_dirs ${project\_source\_dir}/include ${boost\_include\_dirs} cache internal "${project\_name}: include directories" force) </code></pre><h1><code>cmakelists.txt</code> in <code>components/c</code>:</h1><pre><code>cmake\_minimum\_required(version 2.8.10) project(c c cxx) find\_package(xxx required) file(glob cpp\_files source/*.cpp) add\_definitions(${xxx\_definitions}) # note: boost's includes are transitively added through b\_include\_dirs. include\_directories(${b\_include\_dirs} ${xxx\_include\_dirs}) add\_library(${project\_name} shared ${cpp\_files}) target\_link\_libraries(${project\_name} b ${xxx\_libraries}) # expose c's definitions (in this case only the ones of xxx transitively) # to other subprojects through cache variable. set(${project\_name}\_definitions ${xxx\_definitions} cache internal "${project\_name}: definitions" force) # expose c's public includes (including the ones of c's dependencies transitively) # to other subprojects through cache variable. set(${project\_name}\_include\_dirs ${project\_source\_dir}/include ${b\_include\_dirs} ${xxx\_include\_dirs} cache internal "${project\_name}: include directories" force) </code></pre><h1><code>cmakelists.txt</code> in <code>components/a</code>:</h1><pre><code>cmake\_minimum\_required(version 2.8.10) project(a c cxx) file(glob cpp\_files source/*.cpp) # xxx's definitions are transitively added through c\_definitions. add\_definitions(${c\_definitions}) # note: b's and boost's includes are transitively added through c\_include\_dirs. include\_directories(${c\_include\_dirs}) add\_library(${project\_name} shared ${cpp\_files}) # you could need `${xxx\_libraries}` here too, in case if the dependency # of a on c is not purely transitive in terms of xxx, but a explicitly requires # some additional symbols from xxx. however, in this example, i assumed that # this is not the case, therefore a is only linked against b and c. target\_link\_libraries(${project\_name} b c) # expose a's definitions (in this case only the ones of c transitively) # to other subprojects through cache variable. set(${project\_name}\_definitions ${c\_definitions} cache internal "${project\_name}: definitions" force) # expose a's public includes (including the ones of a's dependencies # transitively) to other subprojects through cache variable. set(${project\_name}\_include\_dirs ${project\_source\_dir}/include ${c\_include\_dirs} cache internal "${project\_name}: include directories" force) </code></pre><h1><code>cmakelists.txt</code> in <code>components/executable</code>:</h1><pre><code>cmake\_minimum\_required(version 2.8.10) project(executable c cxx) file(glob cpp\_files source/*.cpp) add\_definitions(${a\_definitions}) include\_directories(${a\_include\_dirs}) add\_executable(${project\_name} ${cpp\_files}) target\_link\_libraries(${project\_name} a c) </code></pre><hr><p>um es klar zu machen, hier ist die entsprechende quellbaumstruktur:</p><pre><code>root of the project ├───components │ ├───executable │ │ ├───resource │ │ │ └───icons │ │ ├───source | | └───cmakelists.txt │ ├───a │ │ ├───include │ │ │ └───a │ │ ├───source | | └───cmakelists.txt │ ├───b │ │ ├───include │ │ │ └───b │ │ ├───source | | └───cmakelists.txt │ └───c │ ├───include │ │ └───c │ ├───source | └───cmakelists.txt └───cmakelists.txt </code></pre><p>es gibt viele punkte, an denen dies angepasst/angepasst oder geändert werden kann, um bestimmte anforderungen zu erfüllen. dies sollte jedoch zumindest den einstieg erleichtern.</p><p><strong> hinweis: </strong>ich habe diese struktur in mehreren mittelgroßen und großen projekten erfolgreich eingesetzt.</p> Wenn eine Spalte in der Datenbank nullfähig ist, hat die Ergebnisklasse auch eine nullfähige Eigenschaft. 

 Wenn beispielsweise eine `Order` eine `Datetime` Spalte mit dem Namen `CreatedDate` , sieht die resultierende `Order` Klasse in etwa wie folgt aus: 


```
public partial class Order: EntityObject
{
  ...
  private DateTime? _createdDate;
  ...
}

```
  Wenn \_ `createdDate` keinen Wert hat, wenn Sie `ObjectContext.SaveChanges()` aufrufen, wird eine `System.DBNull` automatisch als Teil des Befehls insert oder update an die Datenbank gesendet. 

 Hoffe das hilft Alex <h2>ja aber..</h2><p>um es schön und klar zu machen ... wir sprechen von einem kompromiss nur für datenbanken, wenn ein angreifer zugriff auf die datenbank hat, nicht jedoch auf den quellcode der anwendung. in diesem fall erhält der angreifer die kennwort-hashes, kann sie jedoch aufgrund des benutzerdefinierten algorithmus von dave nicht knacken und die ursprünglichen kennwörter abrufen. im falle eines verstoßes nur gegen die datenbank schützt der kennwortalgorithmus von dave die kennwörter besser als bei verwendung von md5 oder sha1.</p><p><strong> dies ist jedoch </strong> nur ein möglicher weg für systemlecks. es gibt eine wichtige tatsache, die die "mathematik" zerstört, die daves homebrew-algorithmus vernünftig erscheinen lässt.</p><h2>die hälfte aller verstöße beginnt intern.</h2><p>(quellen <a href="https://www.helpnetsecurity.com/2019/06/17/human-error-data-breach/">1</a> <a href="https://www.forbes.com/sites/louiscolumbus/2018/08/31/58-of-all-healthcare-breaches-are-initiated-by-insiders/#4a6d911c601a">2</a> ) was eine sehr ernüchternde tatsache ist, wenn sie es einmal einwirken lassen. von der hälfte der von mitarbeitern verursachten verstöße, die hälfte von ihnen ist zufällig und <strong> die hälfte ist absichtlich </strong>. daves algorithmus kann hilfreich sein, wenn sie sich nur um ein nur-datenbank-leck sorgen. wenn das alles ist, worüber sie sich sorgen machen, dann ist das bedrohungsmodell, vor dem sie in ihrem kopf schützen, falsch.</p><p>um nur ein beispiel zu nennen: entwickler haben per definition zugriff auf den anwendungsquellcode. wenn ein entwickler schreibgeschützten zugriff auf die produktionsdatenbank erhält, verfügt er jetzt über alles, was er zum einfachen knacken der kennwörter benötigt. daves benutzerdefinierter algorithmus ist jetzt nutzlos, da er auf alten und leicht zu knackenden hashes basiert.</p><p>wenn dave jedoch einen modernen passwort-hashing-algorithmus verwendet und sowohl salz als auch pfeffer verwendet hätte, hätte der entwickler, der zugriff auf einen nur-datenbank-dump erhalten hat, absolut nichts nützliches.</p><p>das ist nur ein zufälliges beispiel, aber der allgemeine punkt ist einfach: es gibt viele datenlecks in der realen welt, bei denen korrektes hashing den tatsächlichen schaden gestoppt hätte, wenn daves algorithmus dies nicht konnte.</p><h2>zusammenfassend</h2><p>es geht um tiefenverteidigung. es ist einfach, eine sicherheitsmaßnahme zu erstellen, die vor einer bestimmten art von angriff schützen kann (daves algorithmus ist eine leichte verbesserung gegenüber md5 zum schutz vor nur-datenbank-lecks). dies macht ein system jedoch nicht sicher. viele reale verstöße sind ziemlich kompliziert und nutzen schwachstellen an mehreren stellen in einem system aus, um endlich echten schaden zu verursachen. jede sicherheitsmaßnahme, die mit der annahme beginnt, dass dies der einzige angriffsvektor ist, über den ich mir sorgen machen muss (was dave getan hat), wird die dinge gefährlich falsch machen.</p> <p>nachdem ich wochenlang damit rumgespielt hatte, konnte ich es endlich zum laufen bringen. da ich viele offene fragen gefunden habe, werde ich meine eigenen beantworten, um anderen zu helfen.</p><p><strong> wann funktioniert es? </strong></p><p>zuerst war ich mir nicht sicher, wie dieser voreinstellungsprozess aussehen würde. wann wurde die datei abgeholt und was ist zu erwarten, wenn meine vordefinierte datei nicht vollständig oder falsch war? also habe ich zuerst eine manuelle installation durchgeführt und alle gestellten fragen aufgeschrieben. nach der voreinstellung stellte ich fest, dass einige fragen nicht mehr gestellt werden, die fehlgeschlagenen fragen jedoch weiterhin gestellt wurden. also habe ich danach alles versucht, um sie alle vorzuspielen</p><p><strong> server edition </strong></p><p>ich habe im internet gelesen, dass sie die server-edition von ubuntu benötigen, da sie mit der desktop-edition nicht funktioniert. ich bin mir nicht sicher, ob das zutrifft, aber ich habe gerade die serverversion installiert und die desktop-pakete (in meinem fall gnome) in den voreinstellungsdateien installiert.</p><p><strong> bootoptionen </strong></p><p>manchmal wird über die übergabe von parametern durch die startoptionen gesprochen. ich hatte keine ahnung, wie das geht, aber am ende ist es ganz einfach. booten sie einfach vom installationsmedium und wählen sie ihre installationssprache. drücken sie dann f6, um andere optionen zu öffnen, und die startparameter werden angezeigt. drücken sie einfach die esc-taste, um den anderen optionsdialog zu schließen. <a href="https://i.stack.imgur.com/ztu2n.png"><img src="https://i.stack.imgur.com/ztu2n.png" alt="boot options in ubuntu"></a> </p><p>ich wollte nicht jedes mal alle diese optionen in die boot-optionen eingeben, also habe ich die datei\isolinux\isolinux.cfg (von meinem usb-stick) geändert und in diese geändert:</p><pre><code># d-i config version 2.0 # search path for the c32 support libraries (libcom32, libutil etc.) path include menu.cfg default vesamenu.c32 prompt 0 timeout 0 ui gfxboot bootlogo label custom menu label ^belle custom installation kernel /install/vmlinuz append file=/cdrom/preseed/my.seed debian-installer/language=en debian-installer/country=nl console-setup/ask\_detect=false keyboard-configuration/layoutcode=us debian-installer/locale=en\_us.utf-8 localechooser/preferred-locale=en\_us.utf8 initrd=/install/initrd.gz quiet -- </code></pre><p><strong> wann wird die voreinstellungsdatei geladen? </strong></p><p>ich habe gerade meine voreinstellungsdatei auf den usb-stick gelegt. die offizielle dokumentation von ubuntu beschreibt, dass die verschiedenen voreinstellungsmethoden (datei, netzwerk usw.) während der verschiedenen phasen der installation geladen werden. sie beschreiben jedoch nicht, wann die datei vom usb-stick geladen wird. dies geschieht direkt nach all den fragen zu tastatur, sprache usw. sie müssen diese also durch die startoptionen voreinstellen.</p><p><strong> verspäteter befehl </strong></p><p>mit einer der vorbereiteten fragen (später befehl) können sie benutzerdefinierte befehle kurz vor abschluss der installation ausführen. wie viele andere hatte ich probleme, das zum laufen zu bringen. am ende habe ich ein skript auf die festplatte kopiert und /etc/rc.local geändert, damit dieses skript beim ersten start ausgeführt wird. ich tat dies, da ich alle befehle zur verfügung hatte, die ich brauchte. in dieser phase der installation sind leider einige befehle verfügbar.</p><p><strong> referenzen </strong></p><p>ich habe diese informationen aus vielen anderen foren und führern entnommen. ich erinnere mich nicht an alle, aber um dich auf den weg zu bringen:</p><ul> <li>offizielle ubuntu-dokumentation (enthält auch eine beispiel-vorabdatei): <a href="https://help.ubuntu.com/lts/installation-guide/armhf/apbs02.html">https://help.ubuntu.com/lts/installation-guide/armhf/apbs02.html</a> </li> <li>das offizielle ubuntu-server-buch (es beschreibt es detaillierter). diese site enthält einen teil des vorbereiteten themas online: <a href="http://searchitchannel.techtarget.com/feature/performing-an-automated-ubuntu-install-using-preseeding">http://searchitchannel.techtarget.com/feature/performing-an-automated-ubuntu-install-using-preseeding</a> </li> </ul>