Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 尝试在实体框架中的EntityTypeConfiguration上创建HasUnique(泛型挑战)_C#_Generics_C# 4.0_Lambda_Entity Framework 4.1 - Fatal编程技术网

C# 尝试在实体框架中的EntityTypeConfiguration上创建HasUnique(泛型挑战)

C# 尝试在实体框架中的EntityTypeConfiguration上创建HasUnique(泛型挑战),c#,generics,c#-4.0,lambda,entity-framework-4.1,C#,Generics,C# 4.0,Lambda,Entity Framework 4.1,提前谢谢 我继承EntityTypeConfiguration是为了创建一个HasUnique方法 我的目标是在使用泛型时尊重实体框架的模式。所以我确实希望使用泛型和Lambda表达式来完成它 但是,我不是泛型专家,也不是lambda 我在研究EntityTypeConfiguration类,看到了HasMany方法,以及它是如何使用泛型定义和接收表达式>>的 最后,我想说的是: HasUnique(myType => myType.ForeignKey).WithColumn(myTyp

提前谢谢

我继承EntityTypeConfiguration是为了创建一个HasUnique方法

我的目标是在使用泛型时尊重实体框架的模式。所以我确实希望使用泛型和Lambda表达式来完成它

但是,我不是泛型专家,也不是lambda

我在研究EntityTypeConfiguration类,看到了HasMany方法,以及它是如何使用泛型定义和接收表达式>>的

最后,我想说的是:

HasUnique(myType => myType.ForeignKey).WithColumn(myTypeAgain => myTypeAgain.VarcharColumn);
到现在为止,我最后做的是:

HasUnique("column1").WithColumn("column2").WithColumn("column3");
但是,正如我所说,我希望使用泛型和lambda来完成它

我非常感谢你的帮助


我的祝福。

既然您已经有了执行实际工作的代码,我只在这里包括与表达式树相关的部分:

public class ExtendedEntityTypeConfiguration<TEntity> : EntityTypeConfiguration<TEntity>
{
    public UniqueConstraintConfiguration<TEntity> HasUnique(string propertyName)
    {
        var result = new UniqueConstraintConfiguration<TEntity>();
        result.WithColumn(propertyName);
        return result;
    }
    public UniqueConstraintConfiguration<TEntity> HasUnique<TProperty>(Expression<Func<TEntity, TProperty>> property)
    {
        var result = new UniqueConstraintConfiguration<TEntity>();
        result.WithColumn(property);
        return result;
    }
}
public abstract class UniqueConstraintConfiguration
{
    public UniqueConstraintConfiguration WithColumn(string propertyName)
    {
        // TODO: add code here
        return this;
    }
}
public class UniqueConstraintConfiguration<TEntity> : UniqueConstraintConfiguration
{
    public new UniqueConstraintConfiguration<TEntity> WithColumn(string propertyName)
    {
        base.WithColumn(propertyName);
        return this;
    }
    public UniqueConstraintConfiguration<TEntity> WithColumn<TProperty>(Expression<Func<TEntity, TProperty>> property)
    {
        base.WithColumn(((MemberExpression)property.Body).Member.Name);
        return this;
    }
}
公共类ExtendedEntityTypeConfiguration:EntityTypeConfiguration { 公共UniqueConstraintConfiguration HasUnique(字符串属性名称) { var结果=新的UniqueConstraintConfiguration(); 结果.WithColumn(propertyName); 返回结果; } 公共UniqueConstraintConfiguration HasUnique(表达式属性) { var结果=新的UniqueConstraintConfiguration(); result.WithColumn(属性); 返回结果; } } 公共抽象类唯一约束配置 { 公共UniqueConstraintConfiguration with Column(字符串属性名称) { //TODO:在此处添加代码 归还这个; } } 公共类UniqueConstraintConfiguration:UniqueConstraintConfiguration { 公共新UniqueConstraintConfiguration WithColumn(字符串属性名称) { base.WithColumn(propertyName); 归还这个; } 公共UniqueConstraintConfiguration with Column(表达式属性) { base.WithColumn(((MemberExpression)property.Body.Member.Name); 归还这个; } }
我的天哪@Marco,当你的解决方案更干净/更简单时,你为什么要经历所有这些?记住业务/日程安排/未来维护/资源库技能-并保持简单!Lambdas的oal(任何语言改进)是简化复杂的东西,而不是使简单的东西复杂化。

你想要的语法是固定的吗?为了使它类似于HasKey,您需要使用hasinque(myType=>new{myType.column1,myType.column2,myType.column3})您给出了一个很好的建议。但是,你知道,我真的很想看看它是我想要的语法的解决方案(使用HasMany.WithOptional使用EF的相同方法)。它不使用相同的语法,因为它不能:它需要来自两种不同类型的属性。但我试着按照你的要求回答。这正是我想要的!非常感谢你。我已经把它标记为答案。现在,如果不是要求太多,我想知道如何提取某个属性的映射列。例如,如果我的属性myType.Property1被映射(首先通过代码)到fk_Property1数据库列,我如何获得fk_Property1信息?谢谢你们。@Marcalves从
EntityTypeConfiguration
中很难找到它们,但是如果您保留注册的唯一约束属性名称,一旦您创建了
ObjectContext
(如果使用
DbContext
,则使用
IOObjectContextAdapter
),您就可以检查
context.CreateObjectSet().EntitySet.ElementType.NavigationProperties
然后是
navigationProperty.GetDependentProperties()