Как сделать обнуляемое свойство в EF Codefirst? - PullRequest
1 голос
/ 25 января 2011

В моем тестовом приложении "Книжная полка" есть два 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' должен быть типом значения, не допускающим значения NULL, чтобы использовать его в качестве параметра 'T' в универсальном типе или методе 'System.Nullable '

Так что, должно быть, я где-то не так думаю, но не могу понять.Вероятно, легко выжать вас, ребята.

Ответы [ 3 ]

6 голосов
/ 26 января 2011

Вам не нужно делать ничего особенного. Классы всегда обнуляются.

Я только что попробовал это (с 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" />

Когда я запускаю приложение, в окне отображается «ОК». Это означает, что исключений не было. Когда я смотрю в папку App_Data, создается файл BookContext.sdf. Эта база данных содержит таблицу для Книг и Кредиторов. Стол для Кредиторов пуст. В одной Книге содержится одна запись:

ID: 1; Title: "New Title"; Author: "New Author"; ISBN: "New ISBN"; LoanerID: null
1 голос
/ 22 ноября 2012

Если вы говорите о простом свойстве, таком как int, bool или float, используйте int ?, bool? Или float?

как

 public int? ID { get; set; }
 public bool? Exists { get; set; }
0 голосов
/ 26 января 2011

Не могли бы вы просто использовать что-то вроде этого

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

Это должно сделать LoanedTo равным обнуляемому свойству

...