如何在EF Code First中创建可以为空的属性?

时间:2011-01-25 10:40:32

标签: entity-framework-4 ef-code-first

我的“Bookshelf”测试应用程序中有两个POCO:

/// <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; }
}

我的LoanedTo有可能可以为空吗?我的意思是一本书并不总是借给你,对吧!我试过了

public virtual Loaner? LoanedTo { get; set; }

但我明白了: 类型'RebtelTests.Models.Loaner'必须是非可空值类型才能在泛型类型或方法'System.Nullable'中将其用作参数'T'

所以我必须在某处思考错误,但我无法理解。可能很容易挤压你们。

3 个答案:

答案 0 :(得分:6)

你不需要做任何特别的事情。类总是可以为空的。

我刚试过这个(用MVC3):

在我的模型目录中:

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; }
    }
}

在我的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();
        }

    }
}

Web.Config中的连接字符串:

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

运行应用程序时,视图显示“OK”。这意味着没有抛出任何异常。当我查看App_Data文件夹时,已创建BookContext.sdf文件。该数据库包含Books和Loaners的表。 Loaners的表是空的。书籍的一个包含一个记录:

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

答案 1 :(得分:1)

如果你在谈论像int,bool或float这样的简单属性,请使用int?,bool?或float?

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

答案 2 :(得分:-1)

难道你不能只使用这样的东西

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

然后应该使LoanedTo成为可以为空的属性