Entity Framework CTP5 Code-First: как указать тип столбца дискриминатора в сопоставлении таблиц и иерархий?

Эта запись в блоге из группы ADO.NET показывает в примере, как определить сопоставление таблиц и иерархий в Fluent API Entity Framework Code-First. Это (немного упрощенный) пример:

public class Product
{
    public int ProductId { get; set; }
    public string Name { get; set; }
    // more properties
}

public class DiscontinuedProduct : Product
{
    public DateTime DiscontinuedDate { get; set; }
}

... и отображение TPH:

modelBuilder.Entity<Product>()
    .Map<Product>(m => m.Requires("Type").HasValue("Current"))
    .Map<DiscontinuedProduct>(m => m.Requires("Type").HasValue("Old")); 

Type здесь, очевидно, является «чистым» столбцом дискриминатора в таблице базы данных, который не имеет связанного свойства в классах модели. Это нормально и то, что я хочу.

Если я позволю создать таблицы БД для этого сопоставления, столбец Type будет иметь в SQL Server тип nvarchar(MAX).

Есть ли способ настроить тип столбца дискриминатора в Fluent API?

Например: у меня есть столбец дискриминатора Type с возможными значениями "A", "B" or "C", чтобы различать мои производные классы моделей. Как настроить, чтобы столбец в SQL Server имел тип varchar(1)?

(Я пытался использовать просто символьное значение, установив, например, m => m.Requires("Type").HasValue('A') (обратите внимание на одинарные кавычки). Но это вызывает исключение, говорящее мне, что тип char не разрешен в качестве столбца дискриминатора.)


person Slauma    schedule 19.02.2011    source источник


Ответы (1)


Команда EF подтверждает здесь< /strong>, которые изменяют тип столбца дискриминатора в TPH, в настоящее время не поддерживаются. Это то, что они изучают, чтобы увидеть, смогут ли они включить его до RTM.

Тем не менее, я показал, как изменить тип столбца на int в эта статья, но, как они подтверждают, это не полностью поддерживается для все типы с CTP5.

person Morteza Manavi    schedule 19.02.2011
comment
Спасибо за разъяснение! Да, тем временем я изменил дискриминатор на числовой тип, аналогичный примеру в вашем сообщении в блоге, в моем случае: ... .HasValue((byte)0), который создает столбец tinyint в БД. К сожалению, сейчас я сталкиваюсь с другими проблемами с TPH. Одним из них является Nullable Column Problem, который вы описываете. Я понимаю, что EF/TPH должен сделать свойства обнуляемыми, если они относятся к производным типам. Странно то, что даже свойства в базовом классе принудительно обнуляются. Я не понимаю, почему это должно быть так, но метод Required() в Fluent API молча игнорируется. - person Slauma; 20.02.2011
comment
Без проблем. Свойства в базовом классе не отличаются от типичных свойств сущностей, если они являются ссылочными типами, вы можете использовать атрибут Required или метод IsRequired, чтобы сделать их необнуляемыми, и я подтверждаю, что они оба работают :) - person Morteza Manavi; 20.02.2011