我首先遵循EF6代码,并尝试稍微调整以适应我自己的项目,但是在使用初始化程序为数据库播种时遇到了问题。
我创建了两个类:
属性模式:
namespace MyApp.Models
{
public class Property
{
public int ID { get; set; }
public string PropertyName { get; set; }
public virtual PropertyType PropertyType { get; set; }
}
}
和属性类型模式:
namespace MyApp.Models
{
public class PropertyType
{
public int ID { get; set; }
public string Type { get; set; }
public ICollection<Property> Properties { get; set; }
}
}
我的理解是这两者之间存在一对多的关系。一个属性只能是1个属性类型,但是许多属性可以具有相同的属性类型?
但是,当我尝试初始化上下文并为数据库播种时(使用下面的代码),我收到一个错误:
public class MyAppInitializer : System.Data.Entity.DropCreateDatabaseIfModelChanges<MyAppContext>
{
protected override void Seed(MyAppContext context)
{
var propertytypedata = new List<PropertyType>
{
new PropertyType {ID = 1, Type="Villa" },
new PropertyType {ID = 2, Type="Apartment" }
};
propertytypedata.ForEach(p => context.PropertyType.Add(p));
context.SaveChanges();
var propertydata = new List<Property>
{
new Property {PropertyName="Property 1", PropertyType=1, }
};
propertydata.ForEach(p => context.Property.Add(p));
context.SaveChanges();
}
}
问题是,当我尝试在我播种的属性上设置属性类型时,它说:
无法将类型'int'隐式转换为'MyApp.Models.PropertyType'
答案 0 :(得分:1)
示例:
protected override void Seed(MyAppContext context)
{
var propertytypedata = new List<PropertyType>
{
new PropertyType {ID = 1, Type="Villa" },
new PropertyType {ID = 2, Type="Apartment" }
};
foreach(var propertyType in propertytypedata){
propertyType.Properties = new List<Property>
{
new Property {PropertyName="Property 1", PropertyType = propertyType, }
};
context.PropertyType.Add(propertyType)
}
context.SaveChanges();
}
您不需要两次单独添加。实体框架将子集合添加到数据库。现在,只要您将ICollection<Property> Properties
标记为virtual
,就会将属性作为已加载的子集合使用,否则在加载时您需要include()
。