该属性必须是有效的实体类型,并且该属性应该具有非抽象的 getter 和 setter。实体框架 [重复]

Posted

技术标签:

【中文标题】该属性必须是有效的实体类型,并且该属性应该具有非抽象的 getter 和 setter。实体框架 [重复]【英文标题】:The property must be a valid entity type and the property should have a non-abstract getter and setter. Entity Framework [duplicate] 【发布时间】:2014-10-25 03:30:51 【问题描述】:

我有一个关于首先在实体框架中从代码创建数据库的问题。我有以下三个类 1 Person、2 PersonAddress、3 PersonEmploymentHistory 如下所示。

namespace DataAccess.Models

[Table("Profile")]
public class Person

    [Key]
    public int UserId  get; set; 

    [Required(ErrorMessage = "Firstname is required")]
    public string PersonFirstName  get; set; 

    [Required(ErrorMessage = "Surname is required")]
    public string PersonSurname  get; set; 

    [Required(ErrorMessage = "Email is required")]
    [DataType(DataType.EmailAddress)]
    public string PersonEmail  get; set; 
    public int Age  get; set; 

    [Required(ErrorMessage = "Contact Number required")]
    public Int64 PersonNumber  get; set; 

    public bool IsActive  get; set; 

    [ForeignKey("AddressDetails")]
    public int AddressId  get; set; 
    public virtual PersonAddress AddressDetails  get; set; 

    [ForeignKey("EmploymentHistory")]
    public int EmployerId  get; set; 
    public virtual PersonEmploymentHistory EmploymentHistory  get; set; 



PersonAddress 类

namespace DataAccess.Models

[Table("AddressDetails")]
public class PersonAddress

    [Key]
    public int AddressId  get; set; 

    [ForeignKey("UserId")]
    public int UserId  get; set; 

    [Required(ErrorMessage = "Address Line 1 required")]
    public string AddressLine1  get; set; 

    [Required(ErrorMessage = "Address Line 2 required")]
    public string AddressLine2  get; set; 

    [Required(ErrorMessage = "Postcode required")]
    [DataType(DataType.PostalCode)]
    public string PostCode  get; set; 


人员就业历史

namespace DataAccess.Models

[Table("EmploymentHistory")]
public class PersonEmploymentHistory

    [Key]
    public int EmployerId  get; set; 
    public string EmployerName  get; set; 
    public decimal EmployeeSalary  get; set; 
    public DateTime StartDate  get; set; 
    public DateTime EndDate  get; set; 
    public string ReasonForLeaving  get; set; 

    [ForeignKey("UserId")]
    public int UserId  get; set; 


这是我的上下文类

 public class Context : DbContext

    public Context()
        : base("DefaultConnection")
    
        Database.SetInitializer<Context>(new CreateDatabaseIfNotExists<Context>());
    

    public DbSet<Person> Person  get; set; 
    public DbSet<PersonAddress> PersonAddress  get; set; 
    public DbSet<PersonEmploymentHistory> PersonEmployment  get; set; 


现在我在创建外键等时遵循了教程,但是当我运行我的项目并尝试将数据插入到人员表中时,我收到以下错误

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

【问题讨论】:

【参考方案1】:

我也在先学习代码。我正在使用流利的 API,所以我对注释没有经验。我认为你做外键的方式是错误的。我认为它们应该是这样的:

public int UserId  get; set; 
[ForeignKey("UserId")]
public virtual Person User get; set; 

不同之处在于您有一个 FK 类型的变量并对其进行注释。您也可以查找 fluent API。

见http://www.codeproject.com/Articles/319366/EF-Code-First-Add-a-Foreign-Key-relationship

【讨论】:

【参考方案2】:

我在开发和关联多个表时遇到了同样的问题,如果你使用FirstCode,我建议使用以下结构:

在“PersonAddress”类中

   public long UserId get; set; 
   [ForeignKey("UserId")]
   public Person Person  get; set; 

对于您关联的表,请使用指向对象下方或下方的外键。

没用过:

 [ForeignKey("UserId")]
 public int UserId  get; set; 

您将对要关联的其他表执行相同操作。

【讨论】:

【参考方案3】:
[ForeignKey("UserId")]
public virtual Person User get; set; 

[ForeignKey("User")]
public int UserId  get; set; 

你应该像这样使用它。我也有同样的问题,我已经解决了这个问题。

【讨论】:

没有必要同时拥有这两个属性。已经有正确答案了,不用再添加答案了。【参考方案4】:

在 ForeignKey 你需要添加类引用。改为:

[ForeignKey("Person")]
public int UserId  get; set; 
public virtual Person User get; set; 

【讨论】:

如果您使用[ForeignKey("Person")],它将不起作用。你需要使用[ForeignKey("User")]我想。

以上是关于该属性必须是有效的实体类型,并且该属性应该具有非抽象的 getter 和 setter。实体框架 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

首先是实体框架代码。如何将对象类型文件的列表添加到已具有该类型属性的对象

Javascript 在原型中设置具有值类型的对象属性? [关闭]

如何在 NSManagedObject 子类中使用 Transformable 属性作为其实际类型?

EF Core 异常:该属性没有设置值,并且没有可用于类型属性的值生成器

swagger参数是json类型的怎么标记哪些是必须的

最佳实践? - 数组/字典作为核心数据实体属性 [关闭]