【问题标题】:Entity type ‘Business_attrib2object’ has composite primary key defined with data annotations. To set composite primary key, use fluent API实体类型“Business_attrib2object”具有使用数据注释定义的复合主键。要设置复合主键,请使用 fluent API
【发布时间】:2019-07-12 06:34:15
【问题描述】:

我使用 fluent API 设置复合主键,当我尝试创建 ClassesController(使用实体框架的具有视图的 MVC 控制器)时,它仍然是一个错误。

声明类类:

public partial class Classes
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public Classes()
    {
        this.Business_attrib2object = new HashSet<Business_attrib2object>();
        this.Objects = new HashSet<Objects>();
    }
    [Key]
    public System.Guid IdClass { get; set; }
    public string Name { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<Business_attrib2object> Business_attrib2object { get; set; }
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<Objects> Objects { get; set; }
}

声明 Business_attrib2 对象类:

 public partial class Business_attrib2object
{
    [Key]
    public System.Guid IdClass { get; set; }
    [Key]
    public System.Guid IdAttribute { get; set; }

    public Nullable<System.Guid> IdAuthor { get; set; }

    public virtual Attributes Attributes { get; set; }
    public virtual Classes Classes { get; set; }
}

数据库上下文:

public class Business_attrib2objectContext : DbContext
{
    public DbSet<Business_attrib2object> Business_attrib2object { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Business_attrib2object>().HasKey(ba => new { ba.IdClass, ba.IdAttribute });      
    }

    public Business_attrib2objectContext(DbContextOptions<Business_attrib2objectContext> options)
        : base(options)
    {
        Database.EnsureCreated();
    }
}

创建控制器: Creating controller 错误: Error message

【问题讨论】:

    标签: c# entity-framework asp.net-core


    【解决方案1】:

    如果你使用这个:

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Business_attrib2object>().HasKey(ba => new { ba.IdClass, ba.IdAttribute });      
    }
    

    你不需要这个:

    public partial class Business_attrib2object
    {
        [Key]
        public System.Guid IdClass { get; set; }
        [Key]
        public System.Guid IdAttribute { get; set; }
    
        ...
    

    只需删除它应该起作用的[Key] 属性:

    public partial class Business_attrib2object
    {
        public System.Guid IdClass { get; set; }
        public System.Guid IdAttribute { get; set; }
    
        public Nullable<System.Guid> IdAuthor { get; set; }
    
        public virtual Attributes Attributes { get; set; }
        public virtual Classes Classes { get; set; }
    }
    

    【讨论】:

    • 我没有第一种方法。但是当我使用第一种方法并删除 [key] 时,它就可以了!
    【解决方案2】:

    不确定是什么混乱。错误是明确的。您有指定复合主键的数据属性,但您不能这样做。您已经在上下文中获得了必要的 fluent 配置,因此只需删除 Business_attrib2object 类中的两个 [Key] 数据属性即可。

    【讨论】:

      猜你喜欢
      • 2012-02-16
      • 2014-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多