코드가있는 EF를 약간 시도하고 있는데, 내가 잘못 생각한 부분을 알아낼 수는 없습니다. 단지 내 자신의 예일뿐입니다. 나는 아이디어가별로 없어서 내가 잘못 가고있는 곳을 꾸미고 싶습니다.TPH Simple Config/Discriminator 문제
처음으로 위치를 나타내는 POCO 클래스 - 위치는 RadioStation 또는 판매자가 될 수 있습니다. 나는 추가 필드를 추가하지 않았다. (나중에 올 것이다.) 그래서 지금은 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 속성을 재정의 할 필요가 없습니다. 그 재산에 대한 가치를 원한다면 나는 그걸 보여 주려했다. 판별 자 필드의 크기를 구성하려면 맵 호출에서 판별 자 필드의 크기를 지정하십시오. 나는 이것을 보여줄 나의 대답을 업데이트 할 것이다. –
여기 내 주요 혼란이 FK 분야에 기여하고 유창한 API를 사용하여 관계를 형성했다는 것을 알았습니다. 이 경우 클래스의 FK 필드를 매핑하지만 discriminator는 그렇지 않습니다. 나는 이런 이유로 판별자를 수업에서 삭제하는 것을 결코 생각하지 못했습니다. 이것이 API 디자인의 불일치라고 생각됩니다. 어떻게 생각해? – codeputer