每个导航一个 class 属性
One class per navigation property
我正在尝试将 EF6.4 添加到现有代码库(并删除 NHibernate)。
table 之一被多个其他 table 引用。
我已经使用 Entity Framework 6.4 为我逆向工程 classes(代码优先风格,没有设计器)。
对于这个特定的 table 它会生成如下代码:
[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 个 classes,每个带有 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; }
}
我怎样才能做到这一点? (将字段放在基数 class 中是完全可以的)。我不能为此更改数据库。
据我所知,entity framework 不可能在 dataContext 中添加 3 个 classes 作为一个 table.But 你可以投影到三个 classes.So 你的代码看起来像
[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; }
}
所以你的数据库上下文 class 应该有 属性
public MyDbContext: : DbContext
{
public virtual DbSet<MyTable> MyTable{ get; set; }
}
你可以添加投影 classes
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
});
}
}
我正在尝试将 EF6.4 添加到现有代码库(并删除 NHibernate)。 table 之一被多个其他 table 引用。
我已经使用 Entity Framework 6.4 为我逆向工程 classes(代码优先风格,没有设计器)。
对于这个特定的 table 它会生成如下代码:
[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 个 classes,每个带有 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; }
}
我怎样才能做到这一点? (将字段放在基数 class 中是完全可以的)。我不能为此更改数据库。
据我所知,entity framework 不可能在 dataContext 中添加 3 个 classes 作为一个 table.But 你可以投影到三个 classes.So 你的代码看起来像
[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; }
}
所以你的数据库上下文 class 应该有 属性
public MyDbContext: : DbContext
{
public virtual DbSet<MyTable> MyTable{ get; set; }
}
你可以添加投影 classes
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
});
}
}