每个导航属性一个类

问题描述 投票:1回答:1

我正在尝试将EF6.4添加到现有代码库中(并删除NHibernate)。其中一个表被其他多个表引用。

我已经使用Entity Framework 6.4为我反向工程类(代码优先样式,无设计器)。

对于此特定表,它产生如下代码:

[Table("MyTable")]
public partial class MyTable
{
    public Guid Id { get; set; }
    public string Field1 { get; set; }
    public string Field2 { get; set; }

    // Navigation properties
    public virtual TypeA A { get; set; }
    public virtual TypeB B { get; set; }
    public virtual TypeC C { get; set; }
}

我宁愿(匹配现有的NHibernate代码)将MyTable设为3个类,每个类具有1个导航属性(MyTableA,MyTableB,MyTableC):

[Table("MyTable")]
public partial class MyTableA
{
    public Guid Id { get; set; }
    public string Field1 { get; set; }
    public string Field2 { get; set; }

    // Navigation properties
    public virtual TypeA A { get; set; }
}

[Table("MyTable")]
public partial class MyTableB
{
    public Guid Id { get; set; }
    public string Field1 { get; set; }
    public string Field2 { get; set; }

    // Navigation properties
    public virtual TypeB B { get; set; }
}

[Table("MyTable")]
public partial class MyTableC
{
    public Guid Id { get; set; }
    public string Field1 { get; set; }
    public string Field2 { get; set; }

    // Navigation properties
    public virtual TypeC C { get; set; }
}

我该如何完成? (将字段包含在基类中完全可以)。我无法为此更改数据库。

c# entity-framework-6 ef-code-first
1个回答
1
投票

[据我所知,实体框架在dataContext中没有可能将3个类作为一个表添加。但是您可以对3个类进行投影。因此您的代码看起来像]

[Table("MyTable")]
public partial class MyTable
{
    public Guid Id { get; set; }
    public string Field1 { get; set; }
    public string Field2 { get; set; }

    // Navigation properties
    public virtual TypeA A { get; set; }
    public virtual TypeB B { get; set; }
    public virtual TypeC C { get; set; }
}

所以您的数据库上下文类应该具有属性

public MyDbContext: : DbContext
{
    public virtual DbSet<MyTable> MyTable{ get; set; }
}

您不能添加投影类

public class BaseTable
{
    public Guid Id { get; set; }
    public string Field1 { get; set; }
    public string Field2 { get; set; }
}

public class MyTableA: BaseTable
{
    // Navigation properties
    public virtual TypeA A { get; set; }
}

比您可以在存储库中添加基本查询投影

   public class MyTableRepository 
        {
          private IQueryable<MyTableA> tableAEntities;
          public MyTableRepository(MyDbContext  dbContext) 
          {
              tableAEntities = dbContext.MyTable.Select(t => 
                 new MyTableA 
                {
                 Id = t.Id, 
                 Field1 = t.Field1, 
                 Field2 = t.Field2, 
                 A = t.A 
                });
          }
        }
© www.soinside.com 2019 - 2024. All rights reserved.