EF Code First - 复合主键

3

我有一个旧数据库,其中有两列数据,我想将它们映射为1个ID,这是否可行?

例如:

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

那么我的模型绑定器应该长这样:
modelBinder.Entity<Product>().
HasKey(p=>p.ProductID)
.MapSingle(product =>
new {
 colShotDesc = product.ShortDescription,
 colUser = product.UserName
}
).ToTable("Products");

我需要的是类似于ProductID = ShortDescription + UserName的映射方式,因为这两个列共享一个唯一键约束...
不知道这是否有意义,但任何建议都会很好... 请不要询问数据库设计 => 它是现成的,不应更改...这就是为什么我认为EF代码优先可以帮助我(希望能成功)... 因为它看起来像数据库没有定义主键,只有唯一键约束...
无论如何...帮助将是非常棒的...
2个回答

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;} 
}

流畅的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.... 以下是有关复杂类型的更多信息。

0

实际上,您想将单个概念属性映射到多个存储列。 有一个代码可以将列的值连接成属性,到目前为止还不错。
但是让我们想象一下向上下文添加新实体的过程。 因此,我们已经为该属性设置了一个值。EF如何知道将此属性的值写入两个列的规则?
不确定是否可能实现此场景。


是的,我同意这不太干净,但这是我面对的数据库。由于这两列在数据库级别上具有唯一约束条件,因此应确保它们将被设置。我还使用验证来确保它们已设置。我希望我的解决方案在代码中更加简洁,因此我正在寻找组合ProductID。如何在代码优先模式下组装我的连接字段? - server info

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接