我有以下代码第一个模型,我尝试初始化数据库,它给我下面的错误提示。一个用户可以拥有多个产品,因此用户和产品之间存在一对多的关系。
Schema specified is not valid. Errors: The relationship 'Models.Product_CreatedByUser' was not loaded because the type 'User' is not available.
我正在使用代码第一种方法,任何人都可以帮助我。
用户:
public class User
{
public long UserId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public virtual ICollection<Product> Products { get; set; }
}
产品:
public class Product
{
public long ProductId { get; set; }
public string ProductCode { get; set; }
public string Name { get; set; }
public DateTime CreatedDate { get; set; }
public long CreatedBy { get; set; }
public long ModifiedBy { get; set; }
public DateTime ModifiedDate { get; set; }
public bool IsDeleted { get; set; }
[ForeignKey("CreatedBy")]
public virtual User CreatedByUser { get; set; }
[ForeignKey("ModifiedBy")]
public virtual User ModifiedByUser { get; set; }
}
答案 0 :(得分:2)
根据模型,<div>Highest Projected Forecast Available: 1.2 ft</div>
与Product
- 1到User
和1到CreatedBy
有2个多对一FK关系。但是,ModifiedBy
类包含单个User
集合,而EF对每个关系需要一个或零个对应的导航属性。此外,它不知道当前FK应该映射到哪个集合,因此它会默默地尝试创建第三个关系:(由于默认映射不适用于此类场景,因此您需要使用Products
或流畅的API来正确指定映射。
例如,可以像这样指定双向映射:
InverseProperty
Upate:虽然以上修复了映射问题,但它引入了另一个称为多个级联路径的问题,因为默认的EF约定级联删除是打开的 - 多对多的关系。由于您无论如何都需要流畅的配置来关闭一个或两个关系的级联删除,因此您最好删除public class User
{
public long UserId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
[InverseProperty("CreatedByUser")]
public virtual ICollection<Product> CreatedProducts { get; set; }
[InverseProperty("ModifiedByUser")]
public virtual ICollection<Product> ModifiedProducts { get; set; }
}
和ForeignKey
注释并完整配置整个事情:
InverseProperty