实体框架4.1代码优先和一对多映射问题

本文关键字:一对多 映射 问题 框架 代码 实体 | 更新日期: 2023-09-27 17:52:38

我在映射现有数据库时遇到问题。

2张表(简化(

"SomeEntity"
Id int
Name nvarchar

"EntityProperty"
EntityId int
Name nvarchar

并且具有从实体到实体属性的一对多关系。

如何使用EF 4.1 Code First对此进行映射?

提前Thx。

编辑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);
        }
    }

在获取属性的查询中使用Include时出现问题:

列名"SomeEntity_EntityId"无效。列名"SomeEntity_EntityId"无效。

实体框架4.1代码优先和一对多映射问题

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(列。

编辑:顺便说一句:如果你想启用延迟加载,你可以将该集合设置为虚拟集合。

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);(

我解决了这个问题。我无法将简单的PK添加到关系表中。我在所有独特的字段上添加了复杂的PK,并映射了一对多。仅此而已。