Я сначала пытаюсь создать EF с кодом, и я не могу понять, где я ошибся, это просто пример моего собственного. Я просто из идей, и хотел бы пригвоздить меня, где я ошибаюсь ...TPH Simple Config/Discriminator issue
Сначала просто класс POCO, представляющий местоположение - местоположение может быть RadioStation или Merchant. Я еще не добавил дополнительные поля (которые появятся позже), так что прямо сейчас это просто TPH в простой конфигурации, как я могу это сделать.
namespace EFDataClasses.Entities
{
public class RadioStation : Location
{
public RadioStation()
{
}
}
public class Merchant : Location
{
public Merchant()
{
}
}
public class Location
{
public Location()
{
}
public int Loc_ID { get; set; }
public string Loc_Code { get; set; }
public string Loc_Name { get; set; }
public string Loc_Type {get;set;}
}
}
то класс конфигурации:
namespace EFDataClasses.Mapping
{
public class LocationMap : EntityTypeConfiguration<Location>
{
public LocationMap()
{
// Primary Key
this.HasKey(t => t.Loc_ID);
// Properties
this.Property(t => t.Loc_ID)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
// Properties
this.Property(t => t.Loc_Code)
.IsRequired()
.HasMaxLength(50);
this.Property(t => t.Loc_Name)
.IsRequired()
.HasMaxLength(50);
this.Property(t => t.Loc_ID).HasColumnName("Loc_ID");
this.Property(t => t.Loc_Code).HasColumnName("Loc_Code");
this.Property(t => t.Loc_Name).HasColumnName("Loc_Name");
//my discriminator property
this.Property(t => t.Loc_Type).HasColumnName("Loc_Type").HasColumnType("varchar").HasMaxLength(50).IsRequired();
// Table & Column Mappings
this.Map(m =>
{
m.ToTable("Location");
m.Requires("Loc_Type").HasValue("Location");
}
)
.Map<RadioStation>(m =>
{
m.ToTable("Location");
m.Requires("Loc_Type").HasValue("RadioStation");
}
)
.Map<Merchant>(m =>
{
m.ToTable("Location");
m.Requires("Loc_Type").HasValue("Merchant");
}
)
;
}
}
}
здесь контекст:
namespace EFDataClasses
{
public class MyContext : DbContext
{
static MyContext()
{
Database.SetInitializer<MyContext>(new DropCreateDatabaseAlways<MyContext>());
}
public DbSet<EFDataClasses.Entities.Location> Locations {get; set;}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new LocationMap());
}
}
}
и, наконец, класс программа, которая пытается добавить радиостанцию ..
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace EFConsole
{
class Program
{
static void Main(string[] args)
{
var db = new EFDataClasses.MyContext();
db.Locations.Add(new EFDataClasses.Entities.RadioStation() { Loc_Name = "Radio Station Name 1", Loc_Code = "RD1" });
int chngs = db.SaveChanges();
System.Diagnostics.Debugger.Break();
}
}
}
Ошибка, по которой я получение - это ошибка проверки на Loc_Type, говорящая, что это обязательное поле. Мое впечатление здесь заключается в том, что EF заполнит это, когда я выберу соответствующий тип - и все мои чтения поддерживают это.
Если я добавить соответствующий тип расположения - EF дать мне другую ошибку ....
arggghhh!
В конце концов, я хотел бы сделать реферат местоположения, но означает ли это, что я могу отказаться от hasvalue («Location»)?
Я хотел бы переехать сюда, но мне любопытно, где я ошибся. благодаря!
Я думаю, что вы на правильном пути здесь, но я смущен, почему я бы сказал EF, что файл сопоставления является значением для каждого подкласса, а затем также должен переопределить свойство Loc_Type? Я просто хочу контролировать имя и размер поля дискриминатора - используя конфигурацию по соглашению. – codeputer
Вам не нужно переопределять свойство Loc_Type или даже иметь его вообще. Я просто показывал, что если вам нужна какая-то ценность для этого свойства. Если вы хотите настроить размер поля дискриминатора, вы делаете это в вызове Map. Я обновлю свой ответ, чтобы показать это. –
Теперь я понимаю, что мое основное замешательство здесь было внесено полями FK и использование свободного API для отношений. В этом случае мы отображаем поля FK в классе, но для дискриминаторов мы этого не делаем. По этой причине я никогда не думал об исключении дискриминатора из класса. Мне кажется, что это несогласованность в дизайне API. Как вы думаете? – codeputer