【问题标题】:Can we use Entity Framework for working objects saving?我们可以使用实体框架来保存工作对象吗?
【发布时间】:2021-02-03 17:08:04
【问题描述】:

在许多实体框架示例中,存储在数据库中的对象表示为:

public class Animal {
    public int Id {get; set;}
    public string Name {get; set;}
    public int Age {get; set;}

    //...
}

如果我想将 Enity Framework 不仅用于具有一组属性/字段和一些小方法的类,而且还想通过它将大型成熟对象的字段写入数据库,程序将使用它来工作,例如:

public class Animal : BaseObject {
    public int Id {get; set;}
    public string Name {get; set;}
    public int Age {get; set;}

    //...

    public void voice() { /*...*/ }
    public void func1() { /*...*/ }
    public int func2() { /*...*/ }

   //И т.д.
}

实体框架是设计用于处理具有复杂逻辑和继承自他人的类,还是应该创建纯粹用于处理数据库的类?
例如:

数据库类

public class DBAnimal {
    public int Id {get; set;}
    public string Name {get; set;}
    public int Age {get; set;}

    //И т.д...
}

工薪阶层

public class Animal : BaseObject {
    public int Id {get; set;}
    public string Name {get; set;}
    public int Age {get; set;}

    //И т.д...
    
    public Animal(DBAnimal dbAnimal) {
        this.Id = dbAnimal.Id;
        this.Name = dbAnimal.Name;
        this.Age = dbAnimal.Age;
    }    

    public void voice() { /*...*/ }
    public void func1() { /*...*/ }
    public int func2() { /*...*/ }

   //И т.д.
}

还有第二个问题: 如果你仍然使用Entity框架来处理成熟的类,是否有某种注解可以默认使NotMapped类的所有字段,并且Mapped类型的注解将应用于所需的字段?

【问题讨论】:

  • 你可以拥有一个包含public DBAnimal DbAnimal { get; set; }等实体的属性
  • 你可以这样做,但从长远来看,你应该考虑不这样做。为数据模型提供一组单独的类允许您分离功能,因此数据模型中的更改不会破坏现有的工作和测试功能,反之亦然。

标签: c# entity-framework


【解决方案1】:

实体框架会做support inheritance,所以你可能可以做这样的事情。你应该问一个更好的问题吗?

领域驱动设计 (DDD) 的原则认为存储模型应该与领域模型分离。见Are Domain Models different from the Database models

主要论点是适合存储的模型可能不适合使用该模型,反之亦然。例如,您可能会发现要获得所需的性能,您需要一些数据库无法适应的优化搜索结构。

另一个常见问题是模型可能会发生变化,但您仍需要处理旧数据。如果需要,拥有一个存储模型为转换代码提供了一个方便的地方。您甚至可能有多个存储模型。拥有一个简单的基于文件的存储对于诸如测试之类的事情非常方便。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-25
    • 1970-01-01
    • 2019-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多