首先是EF代码 - 复合键

时间:2010-08-03 16:16:31

标签: c# entity-framework code-first

我有一个遗留数据库,它有两个列,我想将它们映射为1 ID,这是可能的

例如

    public class Product
{ 
public string ProductID {get;set;}
public string ShortDescription {get;set;}
public string UserName {get;set;}
}

然后我的Modelbinder看起来像这样

modelBinder.Entity<Product>().
HasKey(p=>p.ProductID)
.MapSingle(product =>
new {
 colShotDesc = product.ShortDescription,
 colUser = product.UserName
}
).ToTable("Products");

我需要的是什么 ProductID =映射中的ShortDescription + UserName ... 因为这两个列共享一个独特的关键约束......

不知道这是否有意义,但任何建议都会很棒...... 请不要询问数据库设计=&gt;这就像它是,不应该改变...这就是为什么我认为EF代码优先可以帮助我(希望交叉手指)... 因为看起来db没有定义pk只是唯一的键约束......

无论如何...... 帮助会很棒......

2 个答案:

答案 0 :(得分:11)

听起来你想要一个复杂的类型并希望通过在属性名称的末尾附加ID的约定来将复杂类型识别为键。

EF CF此时无法做到这一点。

您可以通过Key属性或FluentAPI告诉EF CF有关复合键的信息。

数据注释:

public class Product 
{  
  [Key, Column(Order=0)]
  public string ShortDescription {get;set;} 
  [Key, Column(Order=1)]
  public string UserName {get;set;} 
}

Fluent API:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
  modelBuilder.Entity<Product>()
               .HasKey(p=> new{p.ShortDescription, p.UserName});
}

您可以创建一个复杂的类型,您可以在代码中使用它,使其更符合您希望代码在概念上的工作方式。

public class Product 
{  
  public ProductID Key {get;set;}
}

public class ProductID 
{
  public string ShortDescription {get;set;} 
  public string UserName {get;set;} 
}

然后使用Fluent API映射它:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
  modelBuilder.ComplexType<ProductID>()
               .Property(p=>p.ShortDescription)
               .HasColumnName("ShortDescription")
               .Property(p=>p.UserName)
               .HasColumnName("UserName");
}

或者如果您想使用数据注释:

[ComplexType]
public class ProductID
{
  [Column("ShortDescription")]
  public string ShortDescription {get;set;} 
  [Column("UserName")]
  public string UserName {get;set;} 
}

您必须指定列名称,否则配置将假设列名称为ProductID_ShortDescription ....

Here's some more info on Complex Types.

答案 1 :(得分:0)

实际上,您希望将单个概念属性映射到几个存储列。 有一个代码将列中的值连接到属性,到目前为止一直很好。
但让我们想象一下向上下文添加新实体的过程。 所以,我们为该属性设置了一个值。 EF如何知道将此属性的值写入两列的规则?
不确定这种情况是否可以实施。