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

chr*_*389 7 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; }
}
Run Code Online (Sandbox Code Playgroud)

我想将它用于内置数据类型(字符串、整数等...)以及日期。我想像这样使用它:

var foo = new Foo<string>();
foo.Value = "Hey";
Run Code Online (Sandbox Code Playgroud)

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

我想数据库表看起来像

| Id | Statement | ValueAsString | ValueAsDecimal | ValueAsDate | ValueAsInt | 
| 1  | NULL      | "Hey"         |                |             |            |
| 2  | NULL      |               | 1.1            |             |            |
Run Code Online (Sandbox Code Playgroud)

Roe*_*t M 8

你应该还有一堂课。你的课程Foo应该是抽象的。所以你会得到“:

public abstract class Foo<T> {
    public Guid Id { get; set; }
    public string Statement { get; set; }
    public T Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

那么你的实现类将是:

public class Orders: Foo<Order> {
}
Run Code Online (Sandbox Code Playgroud)

现在您的Orders类具有可以存储的泛型类型。

  • 感谢您的回答:D 有其他方法吗?感觉它违背了泛型的意义? (2认同)
  • 这不是为每个子类型创建一个表吗? (2认同)

Hen*_*Kok 5

如果您想将不同的值类型持久保存到数据库中类似于您问题中的表的单个表中,您可以这样做:

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; }
}
Run Code Online (Sandbox Code Playgroud)

在您的DbContext课程中添加属性:

public DbSet<FooString> FooStrings { get; set: }
public DbSet<FooInt> FooInts { get; set; }
Run Code Online (Sandbox Code Playgroud)

您可以在表中设置的列名OnModelCreating的方法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; }
}
Run Code Online (Sandbox Code Playgroud)

此代码将生成一个表Foos的列IdStatementDiscriminatorValueAsStringValueAsIntDiscrimiator可以在此处找到有关该列的更多信息

结果表的图像

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