该属性必须是有效的实体类型,并且该属性应该具有非抽象的 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 属性作为其实际类型?