如何在实体框架核心中使用泛型类型?

时间:2017-10-19 08:33:10

标签: c# generics ef-core-2.0

如果我的域模型看起来像这样:

public class Foo<T> {
    public Guid Id { get; set; }
    public string Statement { get; set; }
    public T Value { get; set; }
}

我想将它用于内置数据类型(字符串,整数等)以及日期。 我想用它来像:

var foo = new Foo<string>();
foo.Value = "Hey";

如何使用EF Core将其持久保存到数据库?

我想数据库表看起来像

| Id | Statement | ValueAsString | ValueAsDecimal | ValueAsDate | ValueAsInt | 
| 1  | NULL      | "Hey"         |                |             |            |
| 2  | NULL      |               | 1.1            |             |            |

2 个答案:

答案 0 :(得分:4)

你还应该上课。你的班级Foo应该是抽象的。 所以你会得到“:

public abstract class Foo<T> {
    public Guid Id { get; set; }
    public string Statement { get; set; }
    public T Value { get; set; }
}

那么你的实现类将是:

public class Orders: Foo<Order> {
}

现在你的Orders类包含了可存储的泛型类型。

答案 1 :(得分:1)

如果要将不同的值类型持久存储在与问题类似的单个表中,可以执行以下操作:

$('.heroSlide').owlCarousel({
  smartSpeed: 1500,
  items: 1,
  margin:0,
  nav:true,
  dots:true,
  onInitialized: function () { /* read and use $('.topSlidetxt').height() here */ },
  onResized: function () { /* read and use $('.topSlidetxt').height() here */ },
});

在DbContext类中添加属性:

public interface IHasValue<T> {
    T Value { get; set; }
}

public abstract class Foo {
    public Guid Id { get; set; }
    public string Statement { get; set; }
}

public class Foostring : Foo, IHasValue<string> {
    string Value { get; set; }
}

public class FooInt : Foo, IHasValue<int> {
    int Value { get; set; }
}

您可以在DbContext的OnConfiguring方法中为Foo表设置列名:

public DbSet<FooString> FooStrings { get; set: }
public DbSet<FooInt> FooInts { get; set; }

此代码将生成一个表“ Foo”,其中包含ID,Statement,ValueAsString和ValueAsInt列。

您仍然需要为要用于T的每个类型/列创建一个类,我认为您无法解决。