2011-01-25 2 views
1

J'ai deux Poços dans mon application de test « Bibliothèque »:Comment créer une propriété nullable dans EF Codefirst?

/// <summary> 
/// Represents a book 
/// </summary> 
public class Book 
{ 
    public int ID { get; set; } 
    public string Title { get; set; } 
    public string Author { get; set; } 
    public string ISBN { get; set; } 
    public virtual Loaner LoanedTo { get; set; } 
} 

/// <summary> 
/// Represents a Loaner 
/// </summary> 
public class Loaner 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Book> Loans { get; set; } 
} 

Est-il possible que mon LoanedTo pourrait être annulable? Je veux dire qu'un livre n'est pas toujours prêté, c'est vrai! J'ai essayé

public virtual Loaner? LoanedTo { get; set; } 

Mais je reçois: Le type « RebtelTests.Models.Loaner » doit être un type de valeur non annulable afin de l'utiliser comme paramètre « T » dans le type générique ou méthode « du système. Nullable '

Donc je dois penser mal quelque part, mais je ne peux pas comprendre. Squeeze probablement facile pour vous les gars.

Répondre

6

Vous n'avez pas besoin de faire quelque chose de spécial. Les classes sont toujours nullables.

Je viens d'essayer ce (avec MVC3):

Dans mon répertoire Modèles:

namespace MvcApplication2.Models 
{ 
    public class Book 
    { 
     public int ID { get; set; } 
     public string Title { get; set; } 
     public string Author { get; set; } 
     public string ISBN { get; set; } 
     public virtual Loaner LoanedTo { get; set; } 
    } 

    public class Loaner 
    { 
     public int ID { get; set; } 
     public string Name { get; set; } 
     public virtual ICollection<Book> Loans { get; set; } 
    } 

    public class BookContext : System.Data.Entity.DbContext 
    { 
     public System.Data.Entity.DbSet<Book> Books { get; set; } 
     public System.Data.Entity.DbSet<Loaner> Loaners { get; set; } 
    } 
} 

Dans mon HomeController:

namespace MvcApplication2.Controllers 
{ 
    public class HomeController : Controller 
    { 
     // 
     // GET: /Home/ 

     public ActionResult Index() 
     { 
      string message = "OK"; 

      try 
      { 
       var context = new Models.BookContext(); 
       var book = new Models.Book(); 
       book.Title = "New Title"; 
       book.Author = "New Author"; 
       book.ISBN = "New ISBN"; 
       context.Books.Add(book); 
       context.SaveChanges(); 
      } 
      catch (Exception err) 
      { 
       message = err.ToString(); 
      } 

      ViewBag.Message = message; 

      return View(); 
     } 

    } 
} 

ConnectionString dans web.config:

<add name="BookContext" connectionString="Data Source=|DataDirectory|BookContext.sdf" providerName="System.Data.SqlServerCe.4.0" /> 

W Quand je lance l'application, la vue affiche "OK". Cela signifie qu'aucune exception n'a été levée. Lorsque je regarde dans mon dossier App_Data, un fichier BookContext.sdf a été créé. Cette base de données contient un tableau pour les livres et les prêteurs. Le tableau pour les prêteurs est vide. L'un pour les livres contient un enregistrement:

ID: 1; Title: "New Title"; Author: "New Author"; ISBN: "New ISBN"; LoanerID: null 
+0

Wow, je suppose que je devrais avoir testé ma db et les classes avant de passer à l'étape suivante. Il se avère que vous avez raison. Quelque chose plus bas dans mon application est faux. Merci –

-1

Ne pourriez-vous utiliser quelque chose comme ça

public virtual Nullable<Loaner> LoanedTo { get; set; } 

Cela devrait alors faire une LoanedTo Propriété annulable

+2

Loaner est une classe (type de référence), cette déclaration ne compilera pas –

1

Si vous parlez d'une propriété simple comme int, bool ou flotter utilisation int ?, bool ?, ou flotter?

comme

public int? ID { get; set; } 
public bool? Exists { get; set; } 
Questions connexes