2012-08-23 2 views
0

먼저 긴 게시물에 대해 사과 드리겠습니다. 더 자세한 정보를 주면 상황을 이해하는 데 도움이 될 것입니다.처음으로 기존 데이터베이스에 EF 코드 매핑

저는 EF 5 Code First를 사용하여 응용 프로그램의 데이터 계층을 개발하고 모든 것을 기존 데이터베이스에 매핑하려고합니다. DbContext, POCOs, 유창한 테이블 매핑 등을 사용하고 싶지만 기존 데이터베이스 (테이블)는 간단하지 않습니다. 그래서 몇 가지 문제가 있습니다. 지금 상황을 간략하게 설명하고 나중에 몇 가지 질문을하겠습니다.

테이블

AlarmDefinition 
AlarmDefinitionID int (primary key) (is identity) 
... 

Alarm 
AlarmID int (primary key) (is identity) 
AlarmDefinitionID int (sort of a foreign key) (is nullable) 
SampleTagID int (is nullable) 
SampleTime DateTime (is nullable) 
... 

ReasonAction 
Time DateTime (primary key) 
TagID int (primary key) 
ReasonActionID int (primary key) 

ReasonActionDefinition 
ReasonActionID int (primary key) (is identity) 
... 

그래서, 하나 AlarmDefinition 많은 경보를 가질 수 있습니다. 그리고 하나의 ReasonActionDefinition은 많은 ReasonAction을 가질 수 있습니다. Alarm과 ReasonAction 사이에는 암묵적인 관계가 있습니다 (즉, 하나의 Alarm에는 여러 ReasonAction이있을 수 있음). 이것은 내가 가장 고민하는 부분입니다.

포항 강판

AlarmDefinition 
public class AlarmDefinition 
{ 
    public int AlarmDefinitionID { get; set; } 
    ... 
    public virtual ICollection<Alarm> Alarms { get; set; } 
} 

Alarm 
public class Alarm 
{ 
    public int AlarmID { get; set; } 
    public Nullable<int> SampleTagID { get; set; } 
    public Nullable<System.DateTime> SampleTime { get; set; } 
    ... 
    public Nullable<int> AlarmDefinitionID { get; set; } 
    public virtual AlarmDefinition AlarmDefinition { get; set; } 
    // I don’t know if this is set up correctly 
    public virtual ICollection<ReasonAction> ReasonActions { get; set; } 
} 

ReasonAction 
public class ReasonAction 
{ 
    public System.DateTime Time { get; set; } 
    public int TagID { get; set; } 
    public virtual Alarm Alarm { get; set; } 
    public int ReasonActionID { get; set; } // Primary key 
    public virtual ReasonActionDefinition ReasonActionDefinition { get; set; } 
} 

ReasonActionDefinition 
public class ReasonActionDefinition 
{ 
    public int ReasonActionID { get; set; } 
    ... 
    public virtual ICollection<ReasonAction> ReasonActions { get; set; } 
} 

DbContext

public class AppDbContext : DbContext 
{ 
    public DbSet<Alarm> Alarms { get; set; } 
    public DbSet<AlarmDefinition> AlarmDefinitions { get; set; } 
    public DbSet<ReasonAction> ReasonActions { get; set; } 
    public DbSet<ReasonActionDefinition> ReasonActionDefinitions { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Configurations.Add(new AlarmMap()); 
     modelBuilder.Configurations.Add(new AlarmDefinitionMap()); 
     modelBuilder.Configurations.Add(new ReasonActionMap()); 
     modelBuilder.Configurations.Add(new ReasonActionDefinitionMap()); 
    } 
} 

유창함 매핑

AlarmDefinitionMap 
public class AlarmDefinitionMap : EntityTypeConfiguration<AlarmDefinition> 
{ 
    public AlarmDefinitionMap() 
    { 
     this.HasKey(t => t.AlarmDefinitionID); 
     ... 
     this.ToTable("AlarmDefinition"); 
     this.Property(t => t.AlarmDefinitionID).HasColumnName("AlarmDefinitionID"); 
     ... 
    } 
} 

AlarmMap 
public class AlarmMap : EntityTypeConfiguration<Alarm> 
{ 
    public AlarmMap() 
    { 
     this.HasKey(t => t.AlarmID); 
     ... 
     this.ToTable("Alarm"); 
     this.Property(t => t.AlarmID).HasColumnName("AlarmID"); 
     this.Property(t => t.AlarmDefinitionID).HasColumnName("AlarmDefinitionID"); 
     this.Property(t => t.SampleTagID).HasColumnName("SampleTagID"); 
     this.Property(t => t.SampleTime).HasColumnName("SampleTime"); 
     ... 
     this.HasOptional(t => t.AlarmDefinition) 
      .WithMany(d => d.Alarms) 
      .HasForeignKey(t => t.AlarmDefinitionID); 
    } 
} 

ReasonActionMap 
public class ReasonActionMap : EntityTypeConfiguration<ReasonAction> 
{ 
    public ReasonActionMap() 
    { 
     this.HasKey(t => new { t.Time, t.TagID, t.ReasonActionID }); 
     this.Property(t => t.TagID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 
     this.Property(t => t.ReasonActionID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 
     this.ToTable("ReasonAction"); 
     this.Property(t => t.Time).HasColumnName("Time"); 
     this.Property(t => t.TagID).HasColumnName("TagID"); 
     this.Property(t => t.ReasonActionID).HasColumnName("ReasonActionID"); 
     // Relationships 
     // Not sure if this is correct since the related column names in the Alarm table are SampleTagId, not TagID and SampleTime, not Time. And SampleTagID and SampleTime in the Alarm table are not a primary keys. 
     // There's an implicit one-to-many relationship between the Alarm and ReasonAction entities. 
     this.HasRequired(t => t.Alarm) 
      .WithMany(d => d.ReasonActions) 
      .HasForeignKey(t => new { t.TagID, t.Time }); 
     this.HasRequired(t => t.ReasonActionDefinition) 
      .WithMany(d => d.ReasonActions) 
      .HasForeignKey(t => t.ReasonActionID); 
    } 
} 

ReasonActionDefinitionMap 
public class ReasonActionDefinitionMap : EntityTypeConfiguration<ReasonActionDefinition> 
{ 
    public ReasonActionDefinitionMap() 
    { 
     this.HasKey(t => t.ReasonActionID); 
     ... 
     this.ToTable("ReasonActionDefinition"); 
     this.Property(t => t.ReasonActionID).HasColumnName("ReasonActionID"); 
     ... 
    } 
} 

휴! 그것은 많은 것들이었습니다. 어쨌든, 우리 데이터베이스에 대한 몇 가지 이슈와 EF에 매핑하는 것들이 있습니다 : 1. 선언적 참조 무결성 - 트리거 나 레거시 어플리케이션 코드에서 모두 처리됩니다. 2. Alarm 테이블에서 SampleTagID와 SampleTime은 기본 키가 아니지만이 두 컬럼 ReasonAction 테이블과의 암시적인 일대 다 관계에 대한 한 쪽입니다. 3. Alarms와 ReasonAction 테이블 간의 열 이름이 일치하지 않습니다 (AlarmTagID 및 SampleTime, ReasonAction 테이블의 Time 및 TagID).

질문 : A. 위에서 설명한 상황에서 EF 코드를 기존 데이터베이스 및 테이블과 처음으로 연동시킬 수 있습니까? B. B. 일대 다 (one-to-one) 코드를 작성하려면 코드를 어떻게 변경해야합니까? Alarm과 ReasonAction 테이블 사이의 많은 관계 작업 (그래서 내가 Alarm을 질의 할 때 ReasonActions 탐색 속성이 모든 관련 레코드로 채워지도록)?, C. 다른 제안?

감사합니다 !!!

답변

-1

이제 우리는 EF를 버리고 자신 만의 사용자 정의 ADO.NET 코드를 작성했습니다.

관련 문제