4

기존 데이터베이스 매핑에 문제가 있습니다. 간체Entity Framework 4.1 코드 우선 및 일대 다 매핑 문제

2 테이블

"SomeEntity" 
Id int 
Name nvarchar 

"EntityProperty" 
EntityId int 
Name nvarchar 

과 관계가 일대 엔티티로부터 엔티티 속성.

어떻게 EF 4.1 코드를 사용하여 매핑 할 수 있습니까?

Thx. 편집 한

: 속성을 가져올 내가 쿼리에 포함 사용할 때

확인)이 내 코드

class Program 
    { 
     static void Main(string[] args) 
     { 
      var context = new DataContext(); 

      var result = context.SomeEntity.Include(p => p.EntityProperties); 

      foreach (var entity in result) 
      { 
       Console.WriteLine(entity); 
      } 

     } 
    } 

    public class SomeEntity 
    { 
     public int EntityId { get; set; } 
     public string Name { get; set; } 
     public virtual ICollection<EntityProperty> EntityProperties { get; set; } 

     public override string ToString() 
     { 
      return string.Format("Id: {0}, Name: {1}", EntityId, Name); 
     } 
    } 

    public class EntityProperty 
    { 
     public int EntityId { get; set; } 
     public string Name { get; set; } 
    } 

    public class DataContext : DbContext 
    { 
     public DbSet<SomeEntity> SomeEntity { get { return this.Set<SomeEntity>(); } } 

     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      modelBuilder.Entity<SomeEntity>().ToTable("SomeEntity"); 
      modelBuilder.Entity<SomeEntity>().HasKey(k => k.EntityId); 

      modelBuilder.Entity<EntityProperty>().ToTable("EntityProperty"); 
      modelBuilder.Entity<EntityProperty>().HasKey(k => k.EntityId); 
     } 
    } 

문제입니다 :

잘못된 열 이름을 'SomeEntity_EntityId'. 'SomeEntity_EntityId'열 이름이 잘못되었습니다.

+0

'SomeEntity' 클래스에서'EntityId' 대신'Id'를 사용하지 않아야합니까? 그것도 매핑을 변경하십시오. – Damb

+0

Id에서는 동일한 예외가 있지만 다른 메시지가 있습니다. 'SomeEntity_Id'열 이름이 잘못되었습니다. 'SomeEntity_Id'열 이름이 잘못되었습니다. – Gengzu

+0

답변을 수정했습니다. 만약 내가 자고있는 동안 작동시키지 않았다면 시도해보십시오 :) – Damb

답변

1

나는 문제를 해결했다. 간단한 PK를 관계형 테이블에 추가 할 수 없습니다. 모든 고유 필드에 복잡한 PK를 추가하고 일대 다 매핑을 수행했습니다. 그게 다야.

3
public class SomeEntity 
{ 
    public int SomeEntityId {get;set;} 
    public string Name {get;set;} 
    public ICollection<EntityProperty> EntityProperties {get;set;} 
} 

public class EntityProperty 
{ 
    public int EntityPropertyId {get;set;} 
    public string Name {get;set;} 
} 

ICollection (관계의 '1'측)을 작성하면 1 : N 관계를 설정하기에 충분해야합니다. EntityProperty 테이블에 SomeEntity_Id (또는 SomeEntityId) 열을 만듭니다.

편집 : Btw : 지연로드를 활성화하려면 해당 컬렉션을 가상으로 설정할 수 있습니다.

public virtual ICollection<EntityProperty> EntityProperties {get;set} 

편집 :

public class SomeEntity 
{ 
    [Key] 
    public int Id {get;set;} 
    public string Name {get;set;} 
} 

public class EntityProperty 
{ 
    // What is PK here? Something like: 
    [Key] 
    public int Id {get;set;} 

    // EntityId is FK 
    public int EntityId {get;set;} 

    // Navigation property 
    [ForeignKey("EntityId")] 
    public SomeEntity LinkedEntity {get;set;} 

    public string Name {get;set;} 
} 

먼저 다음 다시 ICollection에 추가 할 수 있습니다 .. 이것을 시도, 나는 그것을 간단하게이 시간 (그리고 당신에게 여전히 쿼리 속성을 포함하지 않았다 .. 그러나 함께 : context.EntityProperties.Where(x=>x.EntityId == X);)

+1

나는 EntityPropertyId에 [Column ("EntitiyId")]가 필요하다고 생각합니다. –

+0

그렇지 않습니다. ' Id'와 같은 PK 이름을 지정하면 규칙에 따라 자동으로 PK로 매핑됩니다. 편집 : 흠 .. 어쩌면 내가 틀렸어 ... 왜 그런 주석을 추가하고 싶지? 열의 이름을 바꾸려면? 그렇다면 당신은 맞습니다 :) – Damb

+0

그것은 내가 생각하고있는 PK 측면이 아니 었습니다. 기존 EntityProperty 테이블의 열이 분명히 "EntityId"라고 불렀습니다. EF도이를 처리 할 수 ​​있습니까? –

관련 문제