一对多的关系是明确地将关系放在孩子身上

时间:2015-05-21 11:53:16

标签: c# entity-framework

如果我有以下内容:

class Project
{
    ...
    public virtual IList<URL> URLs {get;set;}
}

class URL
{
    ...
    public virtual Project Project {get;set;}
}

创建的数据库将ProjectID添加到URLs数据库表...

如何强制实体为我创建关系表以删除URL 上的依赖关系,而不必像这样声明ProjectURL来声明新实体

public class ProjectURL
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ProjectURLID { get; set; }

    public URL URL { get; set; }
    public Project Project{ get; set; }
}

我目前拥有的

项目

ProjectID |
---------------------
64        |

网址

URLID     | ProjectID |
---------------------
13        | 64

我想拥有的内容:

项目

ProjectID |
---------------------
64        |

网址

URLID   | 
---------------------
13      | 

Project_URLs

URLID   | ProjectID
---------------------
13      | 64

1 个答案:

答案 0 :(得分:1)

您需要为URL实体配置映射,以便将其拆分为两个表。一个表是URL,另一个表还包含其他属性(如Project的foregin键)。看一下Map方法。

您的映射配置如下所示:

class URLMap : EntityTypeConfiguration<URL>
{
    public URLMap()
    {
        Map(m =>
        {
            m.Properties(p => new {p.ID, p.Project});
            m.ToTable("Project_URLs");
        });
        Map(m =>
        {
            m.Properties(p => new
            {
                p.ID,
                // all other properties separated by ,
            });
            m.ToTable("URLs");
        });
        HasKey(p => p.ID);
    }
}

请注意为两个表定义相同的主键(在上面的示例中,我假设了ID属性)。

编辑:在cas中,您不知道如何处理映射配置类。 您必须将此类的实例添加到DbContext.OnModelCreating

的覆盖中
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Configurations.Add(new URLMap());
}