需要使用公共字段对EF对象执行操作,不确定是否/如何使用接口

时间:2015-05-05 11:37:12

标签: c# entity-framework interface

我正在使用Entity Framework。我有一些存储不同统计信息的数据库表:

Stats1(Stats1ID,Mean)
统计2(Stats2ID,平均值)
统计3(Stats3ID,平均值)

我有多种方法可以整合到一个方法中。这些方法之间的唯一区别是参数:

public static bool IsValid(Stats1 stat, decimal value) { // }
public static bool IsValid(Stats2 stat, decimal value) { // }
// etc

这些方法都使用这些不同Stat对象的公共字段 - 'Mean'。如何用一些通用对象替换第一个参数,我可以用它来访问传入的任何类型的Mean字段?不确定这是否相关,但我使用“数据库优先”并生成类似

的模型

编辑:欣赏答案,很快就会测试一下

3 个答案:

答案 0 :(得分:0)

编辑 - 没有注意到您正在使用Database First。我首先在代码中使用这种方法,它可能不适用于你。但我把它留在这里以防万一有人以后再读这个问题。

您可以定义表示公共字段的interface,例如:

public interface IStatEntity
{
    public int Mean { get; set; }
}

并在所有实体上实现接口。实现界面不会干扰EF的映射,对EF也没有任何意义。

我使用相同的方法来获取CreationTimeLastModificationTime等属性,然后在我的DbContext中集中设置它们。

答案 1 :(得分:0)

您可以使用反射来做您想做的事。

public static bool IsValid<TStats>(TStats stats, decimal value)
{
    if (Equals(stats, null))
        return false;

    // Get the 'Mean' property
    var propertyInfo = typeof(TStats).GetProperty("Mean");

    if (Equals(propertyInfo, null))
        return false;

    // Get
    var meanValue = propertyInfo.GetValue(stats, null) as decimal?;

    // ... do what ever you want with the meanValue
    return meanValue.HasValue && meanValue.Value == value;
}

答案 2 :(得分:0)

所有Stats类都可以实现包含IStat属性的接口,例如Mean。它足以通过另一个部分类扩展生成的部分类:

partial class Stats1 : IStat { }

EF并不介意,只要你不使用导航属性类型的接口(但你不会先使用数据库)。

然后,您可以使用泛型类型约束(where)定义泛型方法:

public static bool IsValid<T>(T stat, decimal value)
    where T : IStat
{
    // Example of what you could do here: 
    return stat.Mean > value);
}

用法:

var valid = IsValid(stat1, 1);