有两个类,它们是从单个基类继承的(我认为这应该是不相关的),分别与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()调用。 但是由于这里没有太多关系...

  ask by blndrj translate from so

本文未有回复,本站智能推荐:

1回复

使用流畅的映射实体框架时,实体类型没有键定义的错误

我正在使用带有流畅映射的Entity Framework。 在我的应用程序中,我想从没有键的视图中获取数据。 我已经写了流利的api的实体映射和从视图中获取数据的方法 当我尝试测试该方法时,出现错误: 实体类型未定义键,为此实体类型定义一个键 我可以使用流利的实体框架从视图
1回复

EF映射到实体上的错误键

当我运行linq查询时,它试图将SchoolInfo.SchoolInfoId映射到SchoolId.SchoolId。 如何定义正确的映射,使其知道将SchoolInfo.SchoolId映射到School.SchoolId? 这是代码优先的。 SQL表 楷模
2回复

EF6如何映射这个零或一对一的关系

这是Code-First。 这种关系的正确流利或数据注释是什么? 获取EF映射错误:无法确定类型“Model.SchoolInfo”和“Model.School”之间关联的主要结束。 必须使用关系流畅API或数据注释显式配置此关联的主要结尾。 如果我加 我收到此错误:在模型生成
1回复

从具有复合主键的查找表到另一个表的FluentAPI映射

我有一个带有复合主键的类,该类用作3个不同表的查找表。 因此,主键是3个相应外键的组合。 我想使用复合键中的键之一作为另一个表的外键。 这是查找表映射 我想将ItemID用作映射到另一个表的外键,但是它不起作用。 我正在尝试使用它来映射它 但这不起作用。 我认为这是因为
1回复

SqLite自动递增其组合键之一

以下几列在SQL Server IDENTITY(1,1)中设置为自动递增,我希望在SqLite上具有类似的行为:租户。 TenantID ,项目。 ProjectID和Credits。 CreditsID 。 尽管AUTOINCREMENT中有AUTOINCREMENT ,并且我已
1回复

仅具有一对零或一对关系在桌上设置组合键

我正在尝试使用EF6定义以下关系A(1)---(0..1)C(0..1)---(1)B ( (x)是基数)。 然后,表C将使用A和B中2个外键的组合键。 这是我想出的流畅的API。 HasKey(t => new { tA, tB}) ,并且需要通常使用.HasForeignKe
1回复

EntityFramework流利的API“孙代”关系映射

我正在尝试绘制EF流利API中似乎很常见的情况,并且碰壁了。 我有以下课程: 带有下表: 公司 ID-整数 师: ID-整型CompanyId整型(FK) 雇员 ID-整数 名称-varchar(50) DivisionId-int(FK) 如果Empl
1回复

使用实体框架映射多个PK

我现在有2节课。 第一个是资产,第二个是与该资产关联的服务。 SQL Server中的资产表在ID和工作流ID上都有一个PK。 第二个表是服务,该服务在3列(服务ID,工作流ID和服务已绑定的资产ID)上都有PK。 示例数据:工作流ID#27中ID为10的资产与工作流ID 27中所有