【问题标题】:EF 4.1 EntityType has no key - compositeEF 4.1 EntityType 没有键 - 复合
【发布时间】:2011-10-22 05:11:11
【问题描述】:

我刚刚使用 NuGet 升级到最新的 EF 4.1 代码优先,现在我收到关于我的映射的错误。

我有这门课

public class UserApplication
{
    [Key, Column(Order = 0)]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int UserId { get; set; }

    [Key, Column(Order = 1)]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int ApplicationId { get; set; }

    [ForeignKey("ApplicationId")]
    public virtual Application Application { get; set; }

    public DateTime SubscribedDate { get; set; }
}

我收到了这个错误:

System.Data.Edm.EdmEntityType: : EntityType 'UserApplication' has no key defined. Define the key for this EntityType.
System.Data.Edm.EdmEntitySet: EntityType: EntitySet 'UserApplications' is based on type 'UserApplication' that has no keys defined.

但是,我可以使用这样的 Fluent API 使其工作

modelBuilder.Entity<UserApplication>().HasKey(obj => new {obj.UserId, obj.ApplicationId });

为什么 EF 不选取我使用注释定义的复合键? 我很确定这曾经适用于较旧的 EF 4.1。

【问题讨论】:

  • 和你有同样的问题。你找到解决方案了吗?
  • 不,我没有。最后,我决定使用 DbModelBuilder 定义所有键。
  • 同样的问题,有趣的是我有两个带有复合键的类,一个可以编译,另一个没有..
  • 看来这在 EF 6 中仍然是一个问题。

标签: entity-framework-4.1 composite-key


【解决方案1】:

适用于实体框架 6.1.3。我还添加了一个基本的Application 类,但按原样使用UserApplication(DatabaseGenerated选项除外。此 SQL 已生成:

CREATE TABLE [dbo].[UserApplication] (
    [UserId] [int] NOT NULL,
    [ApplicationId] [int] NOT NULL,
    [SubscribedDate] [datetime] NOT NULL,
    CONSTRAINT [PK_dbo.UserApplication] PRIMARY KEY ([UserId], [ApplicationId])
)


CREATE TABLE [dbo].[Application] (
    [ApplicationId] [int] NOT NULL IDENTITY,
    [Name] [nvarchar](max),
    CONSTRAINT [PK_dbo.Application] PRIMARY KEY ([ApplicationId])
)

【讨论】:

    【解决方案2】:

    我已经解决了这个问题。我刚刚添加了额外的关键列:

    public class AlbumUser
    {
        public Album Album
        {
            get;
            set;
        }
    
        public IdentityUser User
        {
            get;
            set;
        }
    
        [Key]
        [Column(Order = 0)]
        [StringLength(128)]
        public string UserId
        {
            get;
            set;
        }
    
        [Key]
        [Column(Order = 1)]
        public int AlbumId
        {
            get;
            set;
        }
    }
    

    【讨论】:

    • 我不确定这是否真的回答了这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-22
    相关资源
    最近更新 更多