Entity Framework 4.1 Code First и проблема сопоставления «один ко многим» - PullRequest
4 голосов
/ 22 апреля 2011

У меня проблема с отображением существующей базы данных.

2 таблицы (упрощенно)

"SomeEntity"
Id int
Name nvarchar

и

"EntityProperty"
EntityId int
Name nvarchar

и имеют отношение один ко многим изСущность к свойствам сущности.

Как я могу сопоставить это с помощью EF 4.1 Code First?

Заранее.

Отредактировано 1:

хорошо) это мой код

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'.

Ответы [ 2 ]

3 голосов
/ 22 апреля 2011
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. Он создаст столбец SomeEntity_Id (или SomeEntityId) в таблице EntityProperty.

Редактировать: Кстати: вы можете установить эту коллекцию как виртуальную, если хотите, чтобы ленивая загрузка была включена.

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

Edit:

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 голос
/ 06 мая 2011

Я решил проблему. Я не могу добавить простой ПК в реляционную таблицу. Я добавил сложный ПК на все уникальные поля и сопоставил один-ко-многим. Вот и все.

...