Wie lege ich in Entity Framework ein Feld auf DBNull fest?




 Wie setzen Sie ein Feld in Entity Framework auf DBNull? Die Felder sind stark typisiert, sodass Sie es nicht gleich DBNull.Value setzen können. Ich habe keine Methode gefunden, um ein Feld auf DBNull zu setzen. Es scheint, dass dies eine notwendige Sache ist, aber nach vielem Nachforschen bei Google fand ich nichts darüber. 

 Ich versuche, ein Datumsfeld in Entity Framework mithilfe von vb.net festzulegen. Dafür muss ich schreiben 


```
 myEntity.mydate = Nothing

```
  Dadurch wird das Feld nicht auf NULL festgelegt, sondern es wird stattdessen der Standardwert für das Datum verwendet, bei dem es sich nicht um einen gültigen Datumswert in SQL Server handelt.
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
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>sie können ihr feld auf themenebene anpassen, indem sie die funktion <a href="https://api.drupal.org/api/drupal/modules!field!field.module/function/template\_preprocess\_field/7">template\_preprocess\_field ()</a> unter <code>template.php</code> verwenden.</p><p>sie können einen feldwert erhalten, indem sie das objekt <code>node</code> oder die werte <code>field</code> selbst abrufen. sie können so etwas tun, um den feldwert nach knotenobjekt abzurufen.</p><pre><code>function mytheme\_preprocess\_field(&amp;$vars) { //replace your theme name mytheme here. if ($node = menu\_get\_object()){ if($node-&gt;type == 'product\_display'){//use your product display name here. $vars['node'] = $node; $product\_id = $node-&gt;field\_product\_reference[language\_none][0]['product\_id'];//use your product ref field name here. $product = commerce\_product\_load($product\_id); $manufacturer = $product-&gt;field\_product\_manufacturer[language\_none][0]['value'];//use your field name of product type here. $final\_body\_label = "description by ".$manufacturer; //set body label for node from here itself. $node-&gt;content['body']['#label\_display'] = $final\_body\_label; //or set a variable to use it further. $$vars['manufacturer\_description'] = $final\_body\_label; } } </code></pre><p>außerdem können sie ihre standardvorlage für knoten oder seiten verwenden, wenn sie ihren anforderungen entspricht, oder sie können separate <code>tpl</code> für felder erstellen, die wie <code>field--field\_image.tpl.php</code> benannt werden, wobei <code>field\_image</code> ist der feldname ihres inhalts oder produkts.</p><p>sie erhalten standardmäßig <code>field.tpl</code> in $ <code>base\_path/modules/field/theme</code>.</p> <p>verwenden sie <code>addfield()</code>. hier ist ein beispiel:</p><pre><code>$query = db\_select('super\_long\_table', 'slt'); $query-&gt;addfield('slt', 'mys\_super\_long\_field', 'mslf'); </code></pre><p>an <code>addfield()</code> übergebene argumente sind:</p><ul> <li>tabellenalias</li> <li>feld - ihr langer feldname wird hier sein</li> <li>alias ​​- ihr kurzfeld-alias ​​wird hier sein</li> </ul><p>lesen sie mehr darüber <a href="https://api.drupal.org/api/drupal/includes!database!select.inc/function/selectqueryinterface%3a%3aaddfield/7">hier</a> .</p> <p>angenommen, sie verwenden ms sql server (was sie nicht sind, finden sie im <strong> update unten </strong>):</p><blockquote> <p>eine tabelle kann nur eine zeitstempelspalte haben. der wert in der timestamp-spalte wird jedes mal aktualisiert, wenn eine zeile mit einer timestamp-spalte eingefügt oder aktualisiert wird. diese eigenschaft macht eine timestamp-spalte zu einem schlechten kandidaten für schlüssel, insbesondere für primärschlüssel. bei jeder aktualisierung der zeile wird der zeitstempelwert und damit der schlüsselwert geändert. wenn sich die spalte in einem primärschlüssel befindet, ist der alte schlüsselwert nicht mehr gültig und fremdschlüssel, die auf den alten wert verweisen, sind nicht mehr gültig. wenn in einem dynamischen cursor auf die tabelle verwiesen wird, ändern alle aktualisierungen die position der zeilen im cursor. befindet sich die spalte in einem indexschlüssel, generieren alle aktualisierungen der datenzeile auch aktualisierungen des index.</p> </blockquote><p>informationen zu <a href="http://msdn.microsoft.com/en-us/library/aa260631%28v=sql.80%29.aspx"> msdn </a> </p><p>wenn sie datums-/uhrzeitinformationen für eine zeile speichern müssen und diese datums-/uhrzeitänderung nicht haben, verwenden sie datetime. andernfalls verwenden sie timestamp.</p><p><strong> beachten sie auch: </strong> ms sql server-zeitstempelfelder sind weder datum noch uhrzeit. sie sind binäre darstellungen der relativen reihenfolge, in der die daten geändert wurden.</p><h2>aktualisieren</h2><p>wie sie aktualisiert haben, um mysql zu sagen:</p><blockquote> <p>timestamp-werte werden zum speichern von der aktuellen zeitzone in utc konvertiert und zum abrufen von utc zurück in die aktuelle zeitzone konvertiert. (dies tritt nur für den timestamp-datentyp auf, nicht für andere typen wie datetime.)</p> </blockquote><p>zitat aus <a href="http://dev.mysql.com/doc/refman/5.0/en/timestamp.html">mysql-referenz</a> </p><p>insbesondere:</p><blockquote> <p>wenn sie einen timestamp-wert speichern, dann die zeitzone ändern und den wert abrufen, unterscheidet sich der abgerufene wert von dem von ihnen gespeicherten wert.</p> </blockquote><p>wenn sie also eine anwendung in mehreren zeitzonen verwenden und das datum und die uhrzeit benötigen, um die einstellungen der einzelnen benutzer widerzuspiegeln, verwenden sie timestamp. wenn sie unabhängig von der zeitzone konsistenz benötigen, verwenden sie datetime</p> <p>es gibt optionen, die ihnen dabei helfen:</p><pre><code> --insert-ignore insert rows with insert ignore. --replace use replace into instead of insert into. -t, --no-create-info don't write table creation info. </code></pre><p>denken sie an dieses paradigma</p><ul> <li>mysqldump alles von db1 in dump1</li> <li>laden sie dump1 in db3</li> <li>mysqldump alles aus db2 mit --replace (oder --insert-ignore) und --no-create-info in dump2</li> <li>laden sie dump2 in db3</li> </ul> <p>in ssms so etwas ausführen ...</p><pre><code>use master -- be sure that you're not on mydb alter database mydb set single\_user with rollback immediate drop database mydb; </code></pre> <p>sie können so etwas tun:</p><pre><code>datatable dt = new datatable(); for (int i = 0; i &lt; gridview1.columns.count; i++) { dt.columns.add("column"+i.tostring()); } foreach (gridviewrow row in gridview1.rows) { datarow dr = dt.newrow(); for(int j = 0;j&lt;gridview1.columns.count;j++) { dr["column" + j.tostring()] = row.cells[j].text; } dt.rows.add(dr); } </code></pre><p>und das wird zeigen, dass es funktioniert.</p><pre><code>gridview6.datasource = dt; gridview6.databind(); </code></pre> <p>wenn sie .net 3.5 verwenden, können sie <a href="http://msdn.microsoft.com/en-us/library/system.data.datatableextensions.asenumerable.aspx"><code>datatableextensions.asenumerable</code></a> (eine erweiterungsmethode) verwenden. wenn sie wirklich einen <code>list&lt;datarow&gt;</code> brauchen, anstatt nur <code>ienumerable&lt;datarow&gt;</code>, können sie <a href="http://msdn.microsoft.com/en-us/library/bb342261.aspx"><code>enumerable.tolist</code></a> aufrufen:</p><pre><code>ienumerable&lt;datarow&gt; sequence = dt.asenumerable(); </code></pre><p>oder</p><pre><code>using system.linq; ... list&lt;datarow&gt; list = dt.asenumerable().tolist(); </code></pre> <ul> <li> <p><strong>wählen sie option 1, wenn</strong> die site enthält 'einfache' daten. zum beispiel einfacher text, ein kommentar oder etwas öffentliches</p> </li> <li> <p><strong>wählen sie option 3, wenn</strong> sie möchten nicht, dass der benutzer seitenelemente versehentlich ändert. zum beispiel würde ich in einem buchhaltungsprogramm definitiv option 3 verwenden, aber in einer einfachen notizblock-app (insbesondere auf mobilgeräten) würde ich definitiv option 1 wählen.</p> </li> </ul> <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>