Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 代码优先-添加到相关的“;表格「;在模型中?_C#_Asp.net Mvc_Entity Framework_Ef Code First_Domain Driven Design - Fatal编程技术网

C# 代码优先-添加到相关的“;表格「;在模型中?

C# 代码优先-添加到相关的“;表格「;在模型中?,c#,asp.net-mvc,entity-framework,ef-code-first,domain-driven-design,C#,Asp.net Mvc,Entity Framework,Ef Code First,Domain Driven Design,我有类似的东西 public class Adult { public int AdultId { get; set; } public string Name { get; set; } public virtual IEnumerable<NicknamedKid> NicknamedKids { get; set; } } public class Child { public int ChildId { get; set; } pu

我有类似的东西

public class Adult
{
    public int AdultId { get; set; }
    public string Name { get; set; }

    public virtual IEnumerable<NicknamedKid> NicknamedKids { get; set; }
}

public class Child
{
    public int ChildId { get; set; }
    public string Name { get; set; }
}

public class NicknamedKid 
{
    public int AdultId { get; set; }
    public int ChildId { get; set; } 
    public string Nickname { get; set; }
}
公共类成人
{
public int AdultId{get;set;}
公共字符串名称{get;set;}
公共虚拟IEnumerable昵称dkids{get;set;}
}
公营儿童
{
public int ChildId{get;set;}
公共字符串名称{get;set;}
}
公共类昵称dkid
{
public int AdultId{get;set;}
public int ChildId{get;set;}
公共字符串昵称{get;set;}
}
我的问题是,如果我想创建一个新的
昵称ID
并将其添加到成人,我会将添加
昵称ID
的方法放在
成人
类上,还是放在一些
成人存储库
类上?而且,如果我将它添加到
成人
类中,是否意味着该类必须知道
存储库
类才能添加它


我想我对模型应该了解多少数据层感到困惑。我认为模型应该能够处理自己的层,不知道任何
存储库
DbContext
,但我认为这是不可取的(或可能的)

我责怪微软。无论如何,这通常是一个安全的立场,但特别是在这里,他们真的弄乱了术语。您有一个名为MVC的框架,它显然是按照MVC模式建模的,它们在您的项目中为您提供了名为“模型”、“视图”和“控制器”的文件夹。他们搞砸的地方是创建示例项目,在“模型”文件夹中填充实体,而实体不是模型

如果您来自另一个MVC框架,比如RubyonRails或Django,那么您已经习惯了持久化模型的概念,它也是持久化数据的存储库。然而,微软在MVC上并没有朝这个方向发展,相反,你得到了一个实体,没有关于什么是或者如何建立你的模型的指导。自然的假设是,实体就是模型,就像在你的例子中一样,这只会让人困惑

那么什么是实体?它本质上只是一个DTO,一个数据传输对象。它是一个数据库表的类表示形式,仅作为实体框架填充其检索的数据的地方。MVC模式中的“模型”实际上是存储库/服务(DAL)和视图模型的合并,它们实际上更接近模型本身的概念,而不是实体

为了回答您的问题,那么,不,
成人不应负责添加
昵称dkid
,也不应引用实体框架或任何存储库。它应该只保存持久化的数据和持久化所需的任何应用程序逻辑


另外,只要我们在这里,
昵称ID
就不应该引用
maintal
,成年人也不应该知道
昵称ID
maintal
引用了
Child
,即使您还没有这样设置,
昵称ID
实际上只是
Child
的一个子类。实际上,您只是在
Child
昵称dkid
之间手动实现了TPT(每种类型的表)继承,而实际上没有从另一个继承一个<代码>昵称
实际上只是一个特定类型的
子属性
(也就是说,一个有昵称的实体。无论如何,你不应该有一个实体与另外两个实体有外键的实体有外键。如果你需要从
成人
获取
昵称ID
,你可以通过
儿童
。没有必要建立单独的关系。

我责备你微软。无论如何,这通常是一个安全的立场,但在这里,他们确实弄乱了术语。你有一个名为MVC的框架,显然它是按照MVC模式建模的,他们在你的项目中为你提供了名为“模型”、“视图”和“控制器”的文件夹他们搞砸的地方是创建示例项目,在“模型”文件夹中填充实体,而实体不是模型

如果你来自另一个MVC框架,比如Ruby on Rails或Django,你已经习惯了持久化模型的概念,它也是持久化数据的存储库。然而,微软在MVC上并没有朝这个方向发展,相反,你得到了一个实体,没有关于什么是或如何设置模型的指导。自然的假设是那么,在实体上就是模型,就像在你的例子中一样,它只会让人困惑

那么实体是什么呢?它本质上只是一个DTO,一个数据传输对象。它是一个数据库表的类表示,只是作为实体框架填充它检索到的数据的地方。MVC模式中的“模型”实际上是存储库/服务(DAL)的合并以及视图模型,它们实际上更接近模型本身的概念,而不是实体

为了回答您的问题,那么,不,
maintal
不应该负责添加
昵称dkid
,也不应该引用实体框架或任何存储库。它应该只保存持久化的数据和持久化所需的任何应用程序逻辑

另外,只要我们在这里,
昵称ID
就不应该引用
maintal
,成年人也不应该知道
昵称ID
maintal
references
Child
,即使你没有这样设置(现在),
nicknickdkid
实际上只是
Child
的一个子类。实际上,您只是在
Child
nicknickdkid
之间手动实现了TPT(每种类型的表)继承,而实际上没有从另一个继承