【问题标题】:ASP.NET MVC w/ EF Code first - one controller and 50 'the same' modelsASP.NET MVC w/EF Code first - 一个控制器和 50 个“相同”模型
【发布时间】:2012-02-15 00:42:13
【问题描述】:

我有 50 个这样的“类型模型”(我这样称呼它们),它们看起来像这样:

public class BookType{
    public Guid Id { get; set; }
    public string Value1 { get; set; }
    public string Value2 { get; set; }
}

public class CarType{
    public Guid Id { get; set; }
    public string Value1 { get; set; }
    public string Value2 { get; set; }
}

public class PersonType{
    public Guid Id { get; set; }
    public string Value1 { get; set; }
    public string Value2 { get; set; }
}

所以所有这些模型对于类名都是相同的接受,所有这些模型都将与其他模型有关系。

我需要设计一个功能来提供 CRUD 操作。我想在一个控制器和 1 个用于编辑的视图、1 个用于创建和 1 个用于删除的视图中完成这一切。

我们首先使用 EF 代码进行数据访问。所以我必须做类似的事情:

PersonType tp = new PersonType()
DbContext.PersonTypes.Add(pt)

但是,PersonTypes 也可以是 BookType 类型。我玩了一些反射和接口,但没有成功。

没有什么最佳实践吗?

有人有建议吗?或示例?

【问题讨论】:

  • “Value1”和“Value2”是代码异味。仔细查看您的对象模型,看看您是否可以更明确地了解对象属性。然后你可能想要实现一个 table-per-type 继承方案(谷歌它,你会发现很多)。
  • 您是否使用 value1, value2 作为示例,即。每个类存储不同的数据,或者是实际属性称为 value1 等

标签: asp.net-mvc oop ef-code-first


【解决方案1】:

既然要执行同样的操作,不管是BookTypeCarType等,为什么不把这些都统一到一个表下,加一个Category列呢?

您的实体类如下所示:

public class EditableType {
    public Guid Id { get; set; }
    public int CategoryId { get; set; }
    public string Value1 { get; set; }
    public string Value2 { get; set; }
}

public class Category {
    public int Id { get; set; }
    public string Name { get; set; }
}

如果您的类别名称事先已知(听起来像是),您可以创建enum

public enum CategoryToken {
    Book,
    Person,
    Car
    //...
}

用法:

var personTypes = dbContext.EditableTypes
    .Where(et => et.Category == (int)CategoryToken.Person);
var carTypes = dbContext.EditableTypes
    .Where(et => et.Category == (int)CategoryToken.Car);

var pt = new EditableType
{
    CategoryId = (int)CategoryToken.Person,
    Value1 = "Programmer",
    Value2 = "C#"
};
DbContext.EditableTypes.Add(pt)

【讨论】:

  • 如果他们将来想要添加其他特定类别的属性,这个模型将会失效。
  • @Eranga,没错,但问题的前提是 50 个类别的设计是相同的。我不知道这是否会在未来发生变化,但就目前而言,编写 50 个除了名称相同的类似乎违反了 DRY。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多