代码之家  ›  专栏  ›  技术社区  ›  Eric Obermuller

实体框架多对多关系初始化ICollection[重复]

  •  2
  • Eric Obermuller  · 技术社区  · 7 年前

    作为一个例子,我们假设我们有以下情况:我有一个名为StandardEngineeredModel的类,它具有ModelNumber、VoltageInput、VoltageOutput等属性。

    我还有一个名为Fuse的类,它具有指示符、额定值和类型等属性。在我的数据库模型中,这两个类彼此之间有多对多的关系,一个标准的EngineeredModel可以包含 许多的 保险丝,保险丝可包含在 许多的 不同的标准工程模型。请参见下面的代码。

    public class StandardEngineeredModel
    {
        StandardEngineeredModel()
        {
            Fuses = new List<Fuse>();
        }
    
        [Key]
        public string ModelNumber { get; set; }
        public int VoltageInput { get; set; }
        public string VoltageOutput {get;set;}
    
        public ICollection<Fuse> Fuses { get; set; }
    }
    
    public class Fuse
    {
        [Key,Column(Order = 0)]
        public string Designator { get; set; }
        [Key, Column(Order = 1)]
        public string Rating { get; set; }
        [Key, Column(Order = 2)]
        public string Type { get; set; }
    
        public ICollection<StandardEngineeredModel> StandardEngineeredModels { get; set; }
    }
    

    因此,我的问题是在构造函数中初始化集合的部分:对于我的StandardEngineeredModel,使用列表初始化保险丝是有意义的。但在我的Fuse类中,初始化ICollection对我来说没有意义,因为通常我会将Fuse分配给StandardEngineeredModel,而不是将StandardEngineeredModel分配给Fuse。

    这样做有什么我没有看到的问题吗?这会给我带来什么样的问题?我已经在我的一些应用程序中使用了EF,但还需要多对多关系,所以我正在寻找一些关于这方面的一般建议。

    提前感谢!

    2 回复  |  直到 7 年前
        1
  •  -1
  •   Ben    7 年前

    从技术上讲,您不必在构造函数中初始化集合,但您需要知道它们将为null(特别是因为您没有使用 virtual 关键字启用延迟加载),您需要在整个应用程序中进行检查-否则,您可能会在意外的地方得到null异常。

        2
  •  -1
  •   CodingYoshi    7 年前

    但在我的Fuse类中,初始化ICollection对我来说没有意义,因为通常我会将Fuse分配给StandardEngineeredModel,而不是将StandardEngineeredModel分配给Fuse。

    你上面说的是真的,但我认为,你把这些都弄糊涂了 实体模型 s带a 域模型 。在域模型中,您可以在 StandardEngineeredModel :

    public void AssignFuses(List<Fuse> fuses)
    

    但是在你的 Fuse ,您将不会有这样的方法:

    public void AssignStandardEngineeredModels(
        List<StandardEngineeredModel> sems) // makes no sense
    

    然而,您的域模型客户端(我所说的客户端是指其他类或开发人员)可能需要从 保险丝 标准工程模型 分配给他们的,他们将如何做?那么 保险丝 类将需要只读 List<StandardEngineeredModel> 来帮助解决这个问题。

    确定现在返回实体模型:

    这样做有什么我没有看到的问题吗?这会给我带来什么样的问题?

    作为一种良好的实践,如果您有一个包含其他类的类,那么初始化它们是很好的。为什么?因为我们想善待自己和其他开发人员。考虑一下这一点:

    public class A
    {
        public List<string> SomeThings{ get; set; }
        public A(){}
    }
    

    我正在使用你的类,我看不到代码,因为我正在使用DLL。我这样做:

    var a = new A();
    a.SomeThings.Add("1");
    

    我编译,我把代码交给QA,他们忘了测试这个非常具体的案例,然后它就进入了生产和BAM!!!

    因此,请遵循良好实践并对其进行初始化。我不确定如果您没有初始化EF,它是否会失败,所以也许您可以测试并找出答案。

    一个建议

    我建议不要用后缀命名实体模型 模型 。如果我的客人是对的,那么您可能是在为MVC做这件事,并认为这是您的模型。但问题是,您设计表名的目的是为了在MVC中使用它。如果不是呢?此外,在某些情况下,此模型不足以成为MVC中的模型,并且可能需要其他属性。

    推荐文章