C# 具有列表成员的种子实体框架模型
我有一个带有列表成员的实体框架模型:C# 具有列表成员的种子实体框架模型,c#,entity-framework,C#,Entity Framework,我有一个带有列表成员的实体框架模型: public class MyModel { public int Id { get; set; } public string Name { get; set; } public int Points { get; set; } public List<Feature> Features { get; set; } } 如何将功能初始化为文字列表?将其初始化为枚举列表 var
public class MyModel
{
public int Id { get; set; }
public string Name { get; set; }
public int Points { get; set; }
public List<Feature> Features { get; set; }
}
如何将功能初始化为文字列表?将其初始化为枚举列表
var model = new MyModel
{
Id = 1,
Name = "Test Name",
Points = 2,
Features = new List<Feature>
{
Feature.Feature1,
Feature.Feature2
}
};
var模型=新的MyModel
{
Id=1,
Name=“测试名称”,
点数=2,
功能=新列表
{
功能1,
特色1.特色2
}
};
如何将功能初始化为文字列表
更新正如@Gert非常正确地指出的,您不能在EF数据库中直接使用枚举(噢,drats) 但是,
enum
由int
表示,因此仍然可以使用类将值存储在数据库中
您需要创建一个类来将值存储在数据库中,然后才能从MyModel
类中引用它
像这样:
public enum TypesOfFeature // The enum of features
{
One = 1,
Two = 2,
Three = 3
... // etc.
}
public class Feature // The class to map to a table in your DB
{
public int Id { get; set; }
public TypesOfFeature Type { get; set; }
}
将DbSet
添加到“代码优先”模型中,以便您可以从数据库中访问它。类似于公共DbSet功能{get;set;}
的东西就可以了
手动将值添加到数据库中可能是个好主意,这样您就知道它们的ID将匹配枚举的int
值*您可以使用Seed()
方法中的AddOrUpdate
来完成此操作,然后当您需要添加更多内容时,可以将它们添加到下面*
您需要从数据库返回所需的功能
s,以便将它们分配给您的MyModel.Features
属性
像这样:
Feature featureOne = YourDbContext.Features.Single(x => x.Type == TypesOfFeature.One);
Feature featureTwo = YourDbContext.Features.Single(x => x.Type == TypesOfFeature.Two);
Feature featureThree = YourDbContext.Features.Single(x => x.Type == TypesOfFeature.Three);
然后,在初始化MyModel
对象的代码中,您可以初始化列表
,传入您在上面拉出的所需功能
对象:
var model = new MyModel
{
Id = 1,
Name = "Test Name",
Points = 2,
Features = new List<Feature>
{
featureOne,
featureTwo,
featureThree
}
}
var模型=新的MyModel
{
Id=1,
Name=“测试名称”,
点数=2,
功能=新列表
{
特色一,,
特点二,,
羽毛树
}
}
显然,我不知道您的功能中有什么值,但上面只是一个示例
希望这有帮助!:) static void Main(字符串[]args)
{
MyModel mm=新的MyModel();
mm.Id=1;
mm.Name=“user3728304”;
mm.点=1;
mm.Features=新列表{Feature.one,
二,,
特征3};
Console.Read();
}
看到答案(到目前为止),似乎没有人注意到您无法在数据库中存储列表。想想看,目标数据库字段应该具有哪种数据类型Feature
必须是一个类,映射到它自己的表。可能重复:感谢@GertArnold-为我完成业余时间,忘记了实体框架中的enum
s。我在下面更新了我的答案,现在应该可以解决OP的问题:)错了<代码>列表
无法存储在数据库中。@GertArnold您可以将其存储在不同的表中,例如使用模型id和特征的“模型”特征bu、“一对多”关系b\w模型和特征。是的,但您的答案没有错<代码>列表
无法存储在数据库中。如何在MyModel
种子中使用功能
?我使用context.Features.AddOrUpdate
在种子中添加Feature
对象。然后我执行context.SaveChanges()
,然后执行context.MyModel.AddOrUpdate
,我将其传递给newmymodel{…,Features=newlist{context.Features.Single(x=>x.Type==typesofeature.One)}
。问题是,当我从context
中抓取MyModel
对象时,它们有一个空的Features
列表。您试图使用MyModel.Features
的确切位置是哪里,并得到了这个问题?你在写什么类型的程序(应用程序、MVC等)?功能是空的还是空的?null
?我有一个控制台应用程序,我在其中添加了实体框架。从我的main方法中,我创建了一个上下文并通过执行var firstMyModel=context.MyModel.First()
来获取一个对象。问题是firstMyModel.Features
是null
您是否通过调试器或控制台窗口的输出找到了它?不经意间(我在手机上,所以空间有点有限):您可能想将您的功能声明为导航属性。一个快速的谷歌将向你展示这一点。我可能建议研究EF中的延迟加载/渴望加载,以及如何使用它。您还可以使用显式加载。例如:在执行查询以选择MyModel
对象的位置,使用context.MyModels.Include(x=>x.Features)
从数据库中获取对象。您需要使用System.Data.Entity包含代码>位于代码顶部。
var model = new MyModel
{
Id = 1,
Name = "Test Name",
Points = 2,
Features = new List<Feature>
{
featureOne,
featureTwo,
featureThree
}
}
static void Main(string[] args)
{
MyModel mm = new MyModel();
mm.Id = 1;
mm.Name = "user3728304";
mm.Points = 1;
mm.Features = new List<Feature>{Feature.one,
Feature.two,
Feature.three};
Console.Read();
}