【问题标题】:2 primary keys in a table Entity Framework code first2 表实体框架代码中的主键优先
【发布时间】:2018-04-20 09:02:28
【问题描述】:

我在 SQL Server 中有 3 个表。我想首先在实体框架上使用代码,并且我想互相导航这些表。如您所见,KioskBatch 有一个复合键,并且两个复合键之一同时作为外键,但是当尝试插入时,我收到此错误:

“KioskId”属性无法配置为导航属性。该属性必须是有效的实体类型,并且该属性应该具有非抽象的 getter 和 setter。对于集合属性,该类型必须实现 ICollection,其中 T 是有效的实体类型。

代码:

[Table("tblKiosk")]
public class Kiosk
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Column("Id")]
    public int KioskId { get; set; }
}

[Table("tblCompletionStatus")]
public class CompletionStatus
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public string Status { get; set; }
}

[Table("tblKioskBatch")]
public class KioskBatch
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int KioskBatchId { get; set; }

    public int KioskId { get; set; }

    [Key,ForeignKey("KioskId")]
    public virtual Kiosk Kiosk { get; set; }

    [ForeignKey("CompletionStatus"), DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int? CompletionStatusId { get; set; }
    public virtual CompletionStatus CompletionStatus { get; set; }
}


CREATE TABLE [dbo].[tblKiosk]
(
    [Id] [int] IDENTITY(1,1) NOT NULL,
    CONSTRAINT [PK_tblKiosk] 
        PRIMARY KEY CLUSTERED ([Id] ASC)
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[tblKioskBatch]
(
    [KioskBatchId] [int] NOT NULL,
    [KioskId] [int] NOT NULL,
    [CompletionStatusId] [int] NULL,

    CONSTRAINT [PK_tblKioskBatch] 
        PRIMARY KEY CLUSTERED ([KioskBatchId] ASC, [KioskId] ASC)
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[tblKioskBatch] WITH CHECK 
    ADD CONSTRAINT [FK_tblKioskBatch_tblCompletionStatus] 
    FOREIGN KEY([CompletionStatusId]) REFERENCES [dbo].[tblCompletionStatus] ([Id])
GO

ALTER TABLE [dbo].[tblKioskBatch] CHECK CONSTRAINT [FK_tblKioskBatch_tblCompletionStatus]
GO

ALTER TABLE [dbo].[tblKioskBatch]  WITH CHECK 
    ADD CONSTRAINT [FK_tblKioskBatch_tblKiosk] 
    FOREIGN KEY([KioskId]) REFERENCES [dbo].[tblKiosk] ([Id])
GO

ALTER TABLE [dbo].[tblKioskBatch] CHECK CONSTRAINT [FK_tblKioskBatch_tblKiosk]
GO

CREATE TABLE [dbo].[tblCompletionStatus]
(
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Status] [nvarchar](50) NULL,

    CONSTRAINT [PK_TblCompletionStatus] 
        PRIMARY KEY CLUSTERED ([Id] ASC)
) ON [PRIMARY]

【问题讨论】:

  • 引用属性不能用作键。

标签: c# sql-server entity-framework ef-code-first


【解决方案1】:

映射时可以设置一个由两个组成的主键,例如

    modelBuilder.Entity<YouEntity>()
       .HasKey(e => new { e.Key1, e.Key2} )

【讨论】:

    【解决方案2】:

    更多信息请阅读Fluent API(HasKey)

    代码示例,如果链接不可访问。

    public class SampleContext : DbContext
    {
        public DbSet<Order> Orders { get; set; }
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Order>()
                .HasKey(o => o.OrderNumber);
        }
    }
    public class Order
    {
        public int OrderNumber { get; set; }
        public DateTime DateCreated { get; set; }
        public Customer Customer { get; set; }
        ...
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-15
      • 2016-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-05
      • 1970-01-01
      相关资源
      最近更新 更多