繁体   English   中英

使用组合键将单向1映射为零或一

mapping a unidirectional one to zero-or-one with a composite key

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

有两个类,它们是从单个基类继承的(我认为这应该是不相关的),分别与sqlite数据库中的两个表相对应。
这两个类均包含许可证密钥的值以及创建条目和最后更新条目的值。

还要注意的是,单个许可证可能具有与之关联的任何数量的事件,但是每个许可证只能定义一个事件以自动启动。 同样,连接是单向的; autostart对象将始终引用事件,但并非所有事件都具有引用它们的autostart对象,并且所有事件都不知道它们是否是autostart事件。

类的定义:

public abstract class EntityBase : IModel, ITimestampedEntity
{
    public virtual string LicenseKey { get; set; }
    public virtual DateTime? CreatedAt { get; set; }
    public virtual DateTime? UpdatedAt { get; set; }
}

public class Event : EntityBase, IEvent
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime StartDate { get; set; }
    public DateTime EndDate { get; set; }
}

public class AutoStart : EntityBase
{
    public Event Event { get; set; }
}

我将为sqlite数据库中的两个表提供sql:

CREATE TABLE `event` (
  `id`  INTEGER NOT NULL,
  `name`    TEXT NOT NULL,
  `start_date`  TEXT,
  `end_date`    TEXT,
  `license_key` TEXT,
  `created_at`  TEXT,
  `updated_at`  TEXT,
  PRIMARY KEY(`id`,`license_key`)
);

CREATE TABLE `autostart_event` (
  `license_key` TEXT NOT NULL,
  `event_id`    INTEGER NOT NULL,
  `created_at`  TEXT,
  `updated_at`  TEXT,
  PRIMARY KEY(`license_key`),
  FOREIGN KEY(`license_key`) REFERENCES `event`(`license_key`) ON UPDATE CASCADE,
  FOREIGN KEY(`event_id`) REFERENCES `event`(`id`) ON UPDATE CASCADE
);

请注意,与EF6本身相比,我们使用的SQL遵循命名时间表更多。 因此,在映射中定义了列名。

这些表是使用Entity Framework Fluent API映射的。 在上下文中定义的映射如下:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    // Fluent API event table mapping properties
    var eventMapping = modelBuilder.Entity<Event>().ToTable("event");
    eventMapping.HasKey(@event => new { @event.Id, @event.LicenseKey }).Property(@event => @event.Id).HasColumnName("id").HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
    eventMapping.Property(@event => @event.Name).HasColumnName("name").IsRequired();
    eventMapping.Property(@event => @event.StartDate).HasColumnName("start_date");
    eventMapping.Property(@event => @event.EndDate).HasColumnName("end_date");
    eventMapping.Property(@event => @event.LicenseKey).HasColumnName("license_key");
    eventMapping.Property(@event => @event.CreatedAt).HasColumnName("created_at");
    eventMapping.Property(@event => @event.UpdatedAt).HasColumnName("updated_at");

    // Fluent API event_autostart table mapping properties
    var autoStartMapping = modelBuilder.Entity<AutoStart>().ToTable("autostart_event");
    autoStartMapping.HasKey(autoStart => autoStart.LicenseKey).Property(autoStart => autoStart.LicenseKey).HasColumnName("license_key");
    autoStartMapping.HasRequired(autoStart => autoStart.Event).WithRequiredPrincipal().Map(map => map.MapKey("event_id"));
    autoStartMapping.Property(autoStart => autoStart.CreatedAt).HasColumnName("created_at");
    autoStartMapping.Property(autoStart => autoStart.UpdatedAt).HasColumnName("updated_at");
}

如此处所示,事件表具有一个组合的主键索引,该索引由id和license_key组成。
一个自动启动对象只有一个主键:license_key(因为每个许可证只能定义一个自动启动事件)。

我能够保存和检索数据库中的事件,但是保存自动启动对象时会引发异常,说明:

SQL logic error foreign key mismatch - "autostart_event" referencing "event"

我相信这是由于组合键和非默认列名(毕竟,列名是event_id而不是event),但是,我一直无法找到如何正确地将列名映射到一个。一或零一关系。
文档引用了HasForeignKey()方法,但这仅适用于DependentNavigationPropertyConfiguration对象,这些对象由RequiredNavigationPropertyConfiguration返回。 WithMany()调用。 但是由于这里没有太多关系...

问题暂未有回复.您可以查看右边的相关问题.
1 OneToOne 单向映射到组合键中的一列

我想对嵌入键内的字段进行单向 OneToOne 映射。我已经尝试了 2 天。 我无法继续。 非常感谢任何帮助。 下面是我的实体。 在这里,我试图将 AuditMetaData 中的 VALUE_REF 列映射到 ValueMetaData 的 VALUE_ID 列。 VALUE_ID 是嵌入 id ...

2 如何使用父实体的组合键进行JPA @OneToMany单向映射?

当前,这些只是查询操作,如果您“获取”父级,则希望获取所有子级。 它是遗留的遗留数据库(DB2),其中父表中的三个字段是其组合PK。 子表具有这三个字段,另外一个作为其组合PK。 无需双向。 只需要让孩子和父母一起。 ChildId类非常类似于父类和另一个字段。 我需要 ...

3 使用组合键映射实体

我正在将旧系统转换为使用休眠(版本3.3.x),而不是使用手工SQL。 我遇到了一些将我的数据模型映射到组合键的问题。 我已经创建了一个我认为可行的解决方案,但我对此并不太喜欢。 因此,我想看看如何/应该映射下图,看看我是否处在“正确”的轨道上。 在图中,StuffTypes是一个 ...

4 组合键的EF映射

public class MyConfiguration : EntityTypeConfiguration&lt;MyCode&gt; { public MyConfiguration() { HasKey(c =&gt; new { c.MyCodeId, c.Effective ...

6 使用组合键进行一对多映射的问题

我在旧数据库中有两个表,需要使用NHibernate进行映射。 不幸的是,这些表之一正在使用组合键,我遇到了一个问题,下面将对此进行描述。 首先,这是两个表的架构: 这是域类: 最后,这是NHibernate映射文件: 现在,我在以下代码中使用它们: 发生 ...

8 如何使用组合键映射join-subclass

我要地图Operationfinancial为参加亚类Operation 。 这个模型与我发现的例子的区别在于两者都使用复合键。 操作地图。 OperationFinancial Map。 但是,当我跑,我有这个错误 任何想法? ...

9 如何使用列名不匹配的组合键映射联接子类

我有两个表,说: 不,我没有制作此数据库,也不可以更改它。 我想将CARD_PAYMENT和CHEQUE_PAYMENT映射为PAYMENT joined-subclass 。 该模型与我发现的示例的不同之处在于,我都在使用复合键, 并且外部表中的列名之一不匹配。 我认为,如果 ...

10 Hibernate批注映射到使用组合键的联接表

我有一个实体,我想将OneToOne与带有复合键的表(省略getter / setter)结合在一起: 和: 父级在子级实体中没有“用户名”字段的概念。 我需要将此作为标准。 在数据库中,child的主键位于parentId和username上。 如果我未指定JoinC ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM