如何防止实体模型中的类型和属性持久化到数据库中

本文关键字:持久化 属性 数据库 类型 何防止 实体模型 | 更新日期: 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;}
}

如果我不想将KidsAddress数据类型制作成数据库表,那么这些数据类型将放在项目中的什么位置?我问这个问题是因为我尝试创建一个名为"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

这不是经过编译或测试的,但它应该给出如何实现目标的想法。