标签: table-per-hierarchy

每个层次表和继承实现问题

我正在将旧的ASP应用程序迁移到现代.NET版本,以减少我们正在研究.NET 4.0实体框架的开发时间.但是,我们似乎在这个问题上遇到了障碍.

给定是我们数据库的一小部分:表OBJECT,其中包含汽车列表及其各自的属性.我们还有一个表OBJECT_OPTIONS,对于OBJECT中的给定汽车,它包含一个OPTIONS,ACCESSORIES和STANDARD EQUIPMENT列表.这三种类型都具有相同的字段,因此存储在同一个表中.列ncopt_type用于区分不同的列表.可能的值有:'opt','acc'和'sta'.表OBJECT_OPTIONS通过ncopt_obj_id链接到OBJECT,ncopt_obj_id表示表OBJECT中的唯一汽车(obj_id).

我们的目标是为OBJECT实体提供链接到不同OBJECT_OPTIONS列表的3个属性: - 属性OPTIONS - 属性ACCESSORIES - 属性STANDARDEQUIPMENT

我们已经通过继承模型尝试了关于每个层次表的不同教程和演练,但是没有成功创建可构建模型.

从技术上讲,我们所做的是:

  • 创建实体OBJECT
  • 创建实体OBJECT_OPTIONS,使其成为抽象的
  • 使用基本类型OBJECT_OPTIONS添加实体OPTION,ACCESSORY和STANDARD_EQUIP
  • 在ncopt_type ='...'上为所有三个表添加条件
  • 向OBJECT添加3个导航属性,所有属性都链接到其中一个继承的实体:OPTIONS,ACCESSORIES和STANDAARD_EQUIPMENT

在此设置过程中会出现一堆错误,但最终会出现这样的错误:

错误3032:从第250,286行开始映射片段时出现问题:EntityTypes NCO.Model.OPTION,NCO.Model.ACCESSOIRE,NCO.Model.STANDAARD_EQUIP被映射到表OBJECT_OPTIES中的相同行.映射条件可用于区分这些类型映射到的行.

但是,所有三个对象都存在条件.

我找不到解决这个问题的方法,并且已经花费了太多时间.我们目前正在使用一种解决方法,但是我希望能够解决这个问题,因为在项目结束时这种情况会再出现几次.

任何帮助表示感谢,如果您需要更多信息,请给我发表评论或发送电子邮件.

.net entity-framework-4 table-per-hierarchy

5
推荐指数
1
解决办法
692
查看次数

使用DiscriminatorFormula迁移Hibernate数据库是不好的做法吗?

我有一个使用Hibernate进行数据持久化的应用程序,其中Spring处于最佳状态(很好的衡量标准).直到最近,应用程序中还有一个持久化类,A:

@Entity
public class A {
  @Id
  @Column(unique = true, nullable = false, updatable = false)
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private long id;
  public String name;
}
Run Code Online (Sandbox Code Playgroud)

我已经添加了A的子类,称为B:

@Entity
public class B extends A {
  public String description;
}
Run Code Online (Sandbox Code Playgroud)

添加B后,我现在无法加载A. 抛出以下异常:

class org.springframework.orm.hibernate3.HibernateObjectRetrievalFailureException :: Object with id: 1 was not of the specified subclass: A (Discriminator: null); nested exception is org.hibernate.WrongClassException: Object with id: 1 was not of the specified subclass: A (Discriminator: null)
Run Code Online (Sandbox Code Playgroud)

我将以下注释和属性添加到B,它似乎已经解决了问题.这是解决问题的正确方法吗?

...
@DiscriminatorFormula("(CASE WHEN dtype IS NULL …
Run Code Online (Sandbox Code Playgroud)

java orm persistence hibernate table-per-hierarchy

5
推荐指数
1
解决办法
3837
查看次数

如何使用实体框架5模型首先生成每个层次结构的表

我首先使用Visual Studio 2012与实体框架5模型.我想使用每个层次结构策略的表生成我的数据库,但找不到该选项.实体设计器数据库生成Power Pack不适用于visual studio 2012,或者我找不到它.

有人建议吗?

table-per-hierarchy entity-framework-5 ef-model-first

5
推荐指数
1
解决办法
688
查看次数

Entity Framework 5.0继承多个程序集

我正在使用Entity Framework 5.0,其中包含代码优先方法以及由Table Per Hierarchy表示的业务对象的继承.

我想要有以下结构:

//Assembly 'DataAccess'    
public class MyDbContext : DbContext
{
    DbSet<AbstractClass> CommonObjects.AbstractClasses { get; set; }
}

//Assembly 'CommonObjects'  
public abstract class AbstractClass
{
    //implementation
}

//Assembly 'DerivedObjects'   
public class DerivedClass : AbstractClass
{
    //implementation
}
Run Code Online (Sandbox Code Playgroud)

在运行时,第一次尝试访问DbContext时,编译器会抛出InvalidOperationException:

抽象类型"CommonObjects.AbstractClass"没有映射的后代,因此无法映射.从模型中删除"CommonObjects.AbstractClass",或者将从"CommonObjects.AbstractClass"派生的一个或多个类型添加到模型中.

这种情况甚至可能吗?如果是的话,我做错了什么?

感谢您提前的答案.

附加信息:

也许我应该更具体一点:

我有一个包含我的抽象业务对象的程序集(只有抽象).具体实现(包含逻辑)保存在负责的程序集中,因为它们的逻辑依赖于该程序集中的其他类.问题是,我希望能够在persistance层中存储这些conrete实现.但为此目的,EF必须知道这些类型才能实现映射.但我不想让持久层依赖于我的业务逻辑层 - 只有抽象.

这就是我尝试直接从业务对象层将派生对象添加到DbContext的原因.

例:

AbstractClass derivedClass = new DerivedClass();
MyDbContext.AbstractClasses.Add(derivedClass); 
Run Code Online (Sandbox Code Playgroud)

但随后抛出上述例外情况.我只是想不出一个好的结构来实现这一目标.

inheritance entity-framework table-per-hierarchy entity-framework-5

5
推荐指数
0
解决办法
646
查看次数

EF6-使用基类属性的派生类中的TPH外键映射

我正在将Entity Framework 6.0.2与现有数据库一起使用,其中标签存储在单个表中,如下所示:

  • Id:int,主键
  • TagType:字符串,确定标签的类型,可以是“ usertag”或“ movietag”
  • ItemId:int,包含要引用的项目的ID(用户ID或电影ID)

以下类描述了这种情况:

public class User
{
    public int Id { get; set; }
}

public class Movie
{
    public int Id { get; set; }
}

public abstract class Tag
{
    public int Id { get; set; }
    public int ItemId { get; set; }
}

public class UserTag : Tag
{
    public virtual User User { get; set; }
}

public class MovieTag : Tag
{
    public virtual Movie …
Run Code Online (Sandbox Code Playgroud)

c# entity-framework single-table-inheritance table-per-hierarchy entity-framework-6

4
推荐指数
1
解决办法
3881
查看次数

EF4.1异常创建具有每层次表继承的数据库

我已经创建了一个非常简单的项目来演示每层次表的不一致性.在我试图生成数据库的单元测试中,我根据配置得到了许多错误之一:

没有Required()方法

Map<InActiveUser>(x => x.Requires("IsActive").HasValue(false));
Map<ActiveUser>(x => x.Requires("IsActive").HasValue(true));
Run Code Online (Sandbox Code Playgroud)

提供:

System.Data.DataException : An exception occurred while initializing the database. See the InnerException for details.
  ----> System.Data.EntityCommandCompilationException : An error occurred while preparing the command definition. See the inner exception for details.
  ----> System.Data.MappingException : 
(6,10) : error 3032: Problem in mapping fragments starting at line 6:Condition member 'User.IsActive' with a condition other than 'IsNull=False' is mapped. Either remove the condition on User.IsActive or remove it from the mapping.
Run Code Online (Sandbox Code Playgroud)

用 …

mapping inheritance table-per-hierarchy entity-framework-4.1

3
推荐指数
1
解决办法
3076
查看次数

DiscriminatorFormula

如果我有一个表,我需要多个列作为鉴别器,我唯一的解决方案是使用@DiscriminatorFormula?

我问,因为一些原型设计给了我们一些我无法解释的结果.

失败的原型:最初我们使用超类上的一个@DiscriminatorColumn原型化一个3深的类层次结构,并在子类上包含第二个@DiscriminatorColumn.当然我们得到了这个警告:

Discriminator列必须在根实体中定义,它将在子类中被忽略

我们发现更新有效,但插入没有.所以我们废弃了这个想法.

成功的?原型: 然后我们尝试了以下似乎有效:在子类上省略第二个@DiscriminatorColumn,只在外键上包含@JoinColumn(无论如何我们都需要它).也许,由于连接是针对不同类型的对象,Hibernate/JPA似乎能够找出哪个子类是正确的.有谁能解释一下?

我们应该废弃它并只使用@DiscriminatorFormula来获得在2个鉴别器列上定义的显式关系吗?

java orm persistence hibernate table-per-hierarchy

3
推荐指数
1
解决办法
7034
查看次数

EF:当抽象基础和一些具体类型在TPH表中并且其他类型有自己的表时,我可以混合TPH和TPT吗?

首先,这些问题类似,但绝对不一样:

我可以在实体框架中混合每个层次结构的表和每种类型的表吗? - 指的是另一种情况.

实体框架:每个类型的混合表和每个层次结构的表 - 另一种情况,尽管接受第一个方案的答案与它无关(*).

(*)其次,当使用每个实体的表映射基本实体时,我在实体框架中成功地混合了每个类型的表和每个层次的表,并且该表具有每个层的表的鉴别符在链条下方.


我试图映射以下内容:

表:

BaseTable
{
    int PK1;
    int PK2;
    string? Value1;
    double? Value2;
}

ChildTable3
{
    int PK1;
    int PK2;
    int Value;
}
Run Code Online (Sandbox Code Playgroud)

实体:

abstract BaseEntity : class // Maps to BaseTable
{
    int PK1; // Maps to PK1 in relevant table
    int PK2; // Maps to PK2 in relevant table
}

Entity1 : BaseEntity // Maps to BaseTable when Value1 != null
{
    string Value; // Maps to Value1
}

Entity2 : …
Run Code Online (Sandbox Code Playgroud)

entity-framework table-per-type entity-framework-4 table-per-hierarchy

2
推荐指数
1
解决办法
1590
查看次数

TPH,TPT,TPC和OR映射器

我正在使用一个数据模型,该数据模型具有一组类型,这些类型共享一些常见字段,例如Id,Name,Description。更具体地说:

Document类具有属性列表。这些属性在我们的域中,例如String,Integer,DateTime等类型,以及其他“复杂”类型,例如Address以及String,Integer,Address等列表,现在,在我的脑海中,我将对Attribute类进行建模,以便抽象基类(AttributeBase),它包含公共属性(Id,Name,Description),然后在适当的子类中具有更特定的属性。例如,StringAttribute(值),IntegerAttribute(值),AddressAttribute(街道等),StringListAttribute,IntegerListAttribute,AddressListAttribute。我们正在谈论15-20个不同的子类。但是,您将如何在数据库中为这些类建模?您会选择TPH,TPT还是TPC?我已经读过有关选择TPT和EF 4.1并为TPH设置一张Massiv表时性能下降的信息。即使性能更好,听起来也没错。我们正在谈论表中潜在的10000-1000000 ++数据行。

在这些情况下,您是否有第一手经验?我真的很想就这个问题向您请教。

nhibernate data-modeling table-per-type table-per-hierarchy entity-framework-4.1

2
推荐指数
1
解决办法
2148
查看次数

Entity Framework核心3.1.1多级继承

运行 add-migration 时抛出异常(EF core 3.1.1):

CLR 属性“DiscriminatorLevel2Id”无法添加到实体类型“CustomerBase”,因为它是在 CLR 类型“InternalCustomer”上声明的

下图显示了所需的层次结构(简要):

类图

映射看起来像:

// Discriminator (Level 1)
modelBuilder.Entity<CustomerBase>()              
            .HasDiscriminator(b => b.CustomerTypeId)
            .HasValue<InternalCustomer>((int)CustomerType.Internal)
            .HasValue<ExternalCustomer>((int)CustomerType.External);

// Discriminator (Level 2)
modelBuilder.Entity<InternalCustomer>()
         .HasDiscriminator(b => b.DiscriminatorLevel2Id)
         .HasValue<VIPCustomer>((int)DiscriminatorLevel2.VIP)
         .HasValue<RegularCustomer>((int)DiscriminatorLevel2.Regular);
Run Code Online (Sandbox Code Playgroud)

Entity Framework Core 3.1.1 是否支持“多级继承 TPH”?

c# table-per-hierarchy entity-framework-core

2
推荐指数
1
解决办法
2587
查看次数

EF:选择子类的所有实体(继承)

我正在使用数据库第一种方法和DbContext.我的数据模型中有几个继承结构(TPH).但是DbContext只为基类创建一个DbSet,而为子类创建没有.我应该如何检索指定子类的所有实体?

我无法根据映射标准编写查询,因为我必须从数据模型中删除这些字段.

我可以简单地将新的DbSet添加到Entities类(部分类)吗?

inheritance entity-framework-4 table-per-hierarchy database-first dbcontext

1
推荐指数
1
解决办法
1271
查看次数

使用NHibernate而不使用鉴别​​器来保持每个类层次结构的一个表?

我有一个接口和一个实现此接口的类.

public interface IPhase {
    string Description { get; set; }
    int Id { get; }
    string Phase { get; set; }
}

public class Phase : IPhase {
    // Implementation here...
}
Run Code Online (Sandbox Code Playgroud)

现在,使用NHibernate 2.1.2.GA,我希望使用table-per-class-hierarchy来映射接口及其实现者,实际上,我不需要一个鉴别器,因为这个实现者将是唯一的类持久化在这张表中.我现在还没有使用NHibernate大约一年半,我在这里遇到了一些内存空白......

我已经阅读了这个问题和相关的答案,除了我没有使用FNH.
NHibernate映射:将层次结构保存到单个表而不带鉴别器

  1. 我想知道这个discriminator属性在使用时是否是强制性的subclass

  2. 在这个特定的上下文中,我的XML映射会是什么样子?

谢谢你的帮助!

nhibernate interface nhibernate-mapping table-per-hierarchy discriminator

0
推荐指数
1
解决办法
1783
查看次数