我正在将旧的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
我们已经通过继承模型尝试了关于每个层次表的不同教程和演练,但是没有成功创建可构建模型.
从技术上讲,我们所做的是:
在此设置过程中会出现一堆错误,但最终会出现这样的错误:
错误3032:从第250,286行开始映射片段时出现问题:EntityTypes NCO.Model.OPTION,NCO.Model.ACCESSOIRE,NCO.Model.STANDAARD_EQUIP被映射到表OBJECT_OPTIES中的相同行.映射条件可用于区分这些类型映射到的行.
但是,所有三个对象都存在条件.
我找不到解决这个问题的方法,并且已经花费了太多时间.我们目前正在使用一种解决方法,但是我希望能够解决这个问题,因为在项目结束时这种情况会再出现几次.
任何帮助表示感谢,如果您需要更多信息,请给我发表评论或发送电子邮件.
我有一个使用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) 我首先使用Visual Studio 2012与实体框架5模型.我想使用每个层次结构策略的表生成我的数据库,但找不到该选项.实体设计器数据库生成Power Pack不适用于visual studio 2012,或者我找不到它.
有人建议吗?
我正在使用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
我正在将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
我已经创建了一个非常简单的项目来演示每层次表的不一致性.在我试图生成数据库的单元测试中,我根据配置得到了许多错误之一:
没有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
如果我有一个表,我需要多个列作为鉴别器,我唯一的解决方案是使用@DiscriminatorFormula?
我问,因为一些原型设计给了我们一些我无法解释的结果.
失败的原型:最初我们使用超类上的一个@DiscriminatorColumn原型化一个3深的类层次结构,并在子类上包含第二个@DiscriminatorColumn.当然我们得到了这个警告:
Discriminator列必须在根实体中定义,它将在子类中被忽略
我们发现更新有效,但插入没有.所以我们废弃了这个想法.
成功的?原型: 然后我们尝试了以下似乎有效:在子类上省略第二个@DiscriminatorColumn,只在外键上包含@JoinColumn(无论如何我们都需要它).也许,由于连接是针对不同类型的对象,Hibernate/JPA似乎能够找出哪个子类是正确的.有谁能解释一下?
我们应该废弃它并只使用@DiscriminatorFormula来获得在2个鉴别器列上定义的显式关系吗?
首先,这些问题类似,但绝对不一样:
我可以在实体框架中混合每个层次结构的表和每种类型的表吗? - 指的是另一种情况.
实体框架:每个类型的混合表和每个层次结构的表 - 另一种情况,尽管接受第一个方案的答案与它无关(*).
(*)其次,当使用每个实体的表映射基本实体时,我在实体框架中成功地混合了每个类型的表和每个层次的表,并且该表具有每个层的表的鉴别符在链条下方.
我试图映射以下内容:
表:
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
我正在使用一个数据模型,该数据模型具有一组类型,这些类型共享一些常见字段,例如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
运行 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”?
我正在使用数据库第一种方法和DbContext.我的数据模型中有几个继承结构(TPH).但是DbContext只为基类创建一个DbSet,而为子类创建没有.我应该如何检索指定子类的所有实体?
我无法根据映射标准编写查询,因为我必须从数据模型中删除这些字段.
我可以简单地将新的DbSet添加到Entities类(部分类)吗?
inheritance entity-framework-4 table-per-hierarchy database-first dbcontext
我有一个接口和一个实现此接口的类.
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映射:将层次结构保存到单个表而不带鉴别器
我想知道这个discriminator属性在使用时是否是强制性的subclass?
在这个特定的上下文中,我的XML映射会是什么样子?
谢谢你的帮助!
nhibernate interface nhibernate-mapping table-per-hierarchy discriminator
inheritance ×3
c# ×2
hibernate ×2
java ×2
nhibernate ×2
orm ×2
persistence ×2
.net ×1
dbcontext ×1
interface ×1
mapping ×1