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