如何防止实体模型中的类型和属性持久化到数据库中
本文关键字:持久化 属性 数据库 类型 何防止 实体模型 | 更新日期: 2023-09-27 18:24:10
我创建了一个MVC项目,该项目使用实体框架来创建数据库。我有两个模型,每个模型大约有5个字段。然而,我希望其中一些字段具有我自己创建的唯一返回类型,但我不希望将唯一的数据类型制成表。
编辑
根据评论:为了澄清,我仍然希望个人和职业表在的适当部分下有孩子和地址数据
例如:
型号:
class Person {
[Key]
public int PersonID{get;set}
public string name {get;set;}
public int age {get;set;}
//note below: return type is ICollection of type Kids
//or it can just be a return type of type Kids like so
//public Kids kids {get;set;}
public ICollection<Kids> kids {get;set;}
public int OccupationID{get;set;}
public virtual Occupation Occupation {get;set}
}
class Occupation {
[Key]
public int OccupationID{get;set;}
public string OccupationName{get;set}
//note the line below has a return type of Address
public Address Location{get;set;}
public int PersonID{get;set;}
public virtual Person Person{get;set;}
}
以上使用的其他数据类型
class Kids {
public int numberOfKids{get;set;}
public List<string> namesOfKids{get;set;}
}
class Address {
public string street{get;set;}
public string city{get;set;}
public int apartmentNumber{get;set;}
}
如果我不想将Kids
和Address
数据类型制作成数据库表,那么这些数据类型将放在项目中的什么位置?我问这个问题是因为我尝试创建一个名为"src"的新文件夹并将它们放在该文件夹中,但当我尝试为Person模型创建一个新的脚手架项目时,我遇到了一个错误,说这些数据类型没有密钥。
另一个问题:我知道我在问如何不将这些数据类型制作成表,但这是一种糟糕的做法吗?我应该也把它们做成桌子吗?
还有:我可以有多个虚拟字段吗?还是打碎了什么?
我真的很感谢的帮助
如果您想要实现的只是不在数据库中创建某些类字段,那么您可以使用[NotMapped]
数据注释
class Occupation {
[Key]
public int OccupationID{get;set;}
public string OccupationName{get;set}
[NotMapped]
public Address Location{get;set;}
public int PersonID{get;set;}
public virtual Person Person{get;set;}
}
在上面的场景中,在创建数据库结构和查询数据库时,[NotMapped]
属性下的字段将被忽略。
可以在这里阅读更多关于该课程的信息:http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.schema.notmappedattribute(v=vs.110).aspx
除此之外,不要在DbContext中包含任何您不希望为创建表的类
此外,就您的can I have multiple virtual fields? or does that break something?
而言:
实体框架中的virtual
属性主要用于允许延迟加载,如果您在系统中配置了它的话。
然而,它也会对变化跟踪产生影响。如果您使用的是纯POCO,或者使用的是代理,但没有使属性成为虚拟的,那么更改检测将变得更加复杂。您可以在此处阅读更多详细信息:http://blog.oneunicorn.com/2012/03/10/secrets-of-detectchanges-part-1-what-does-detectchanges-do/
如果不希望映射类,请不要将其作为DbSet<T>
包含在DbContext
类中。
如果在类中不希望映射属性,则可以在属性中使用NotMapped
属性,或者,如果使用fluent api,则可以执行以下操作:
modelBuilder.Entity<Person>().Ignore(p => p.LastName);
实现这一点的一种方法是使用接口以您想要的方式塑造类,并在getters中组成复杂对象:
public interface IPerson
{
string name {get;set;}
int age {get;set;}
Kids kids {get;}
Occupation Occupation {get;}
void AddKid(string name);
}
public class Person : IPerson
{
[Key]
public int PersonID{get;set}
public string name {get;set;}
public int age {get;set;}
[NotMapped]
public Kids kids { get
{
Kids k = new Kids
{
namesOfKids = (new []
{
Name1,
Name2,
Name3,
// ...
}).Where(n => n != null).ToList();
};
k.numberOfKids = k.namesOfKids.Count;
return k;
}
}
public int numberOfKids{get; set;}
public List<string> namesOfKids{get; set;}
public int OccupationID{get;set;}
[NotMapped]
public Occupation Occupation {get { // TODO }}
public string Name1 { get; set; }
public string Name2 { get; set; }
// ... Add more name fields up to the max
public void AddKid(string name)
{
switch (numberOfKids)
{
case 0: Name1 = name;
break;
case 1: Name2 = name;
break;
// ...
}
numberOfKids ++;
}
}
class Kids
{
public int numberOfKids{get;set;}
public List<string> namesOfKids{get;set;}
}
需要注意的是,您将只在代码中使用IPerson
对象。您可以将任何Person
对象直接强制转换为IPerson
。
这不是经过编译或测试的,但它应该给出如何实现目标的想法。