Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.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# EF代码优先-复合密钥_C#_Entity Framework_Code First - Fatal编程技术网

C# EF代码优先-复合密钥

C# EF代码优先-复合密钥,c#,entity-framework,code-first,C#,Entity Framework,Code First,我有一个遗留数据库,它有两个collumn,我想将它们映射为一个ID,这可能吗 比如说 public class Product { public string ProductID {get;set;} public string ShortDescription {get;set;} public string UserName {get;set;} } 然后我的Modelbinder看起来像这样 modelBinder.Entity<Product>(). HasKe

我有一个遗留数据库,它有两个collumn,我想将它们映射为一个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");
modelBinder.Entity()。
HasKey(p=>p.ProductID)
.MapSingle(产品=>
新的{
colShotDesc=产品。简短描述,
colUser=product.UserName
}
).ToTable(“产品”);
我需要的是 ProductID=ShortDescription+映射中的用户名。。。 因为这两个合谋共享一个唯一的密钥约束

不知道这是否合理,但任何建议都会很好。。。 请不要询问数据库设计=>这是事实,不应更改。。。这就是为什么我认为EF代码首先可以帮助我的原因(希望是十字架)。。。 因为看起来db没有定义pk,只有唯一的键约束

无论如何。。。
帮助将非常好。

实际上,您希望将单个概念属性映射到几个存储列。 有一段代码可以将列中的值连接到属性中,到目前为止还不错
但让我们想象一下向上下文添加新实体的过程。 因此,我们为属性设置了一个值。EF如何知道将此属性的值写入两列的规则

不确定是否可以实现此方案。

听起来您想要一个复杂类型,并希望通过使用在属性名称末尾附加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});
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
  modelBuilder.ComplexType<ProductID>()
               .Property(p=>p.ShortDescription)
               .HasColumnName("ShortDescription")
               .Property(p=>p.UserName)
               .HasColumnName("UserName");
}
然后使用Fluent API对其进行映射:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
  modelBuilder.Entity<Product>()
               .HasKey(p=> new{p.ShortDescription, p.UserName});
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
  modelBuilder.ComplexType<ProductID>()
               .Property(p=>p.ShortDescription)
               .HasColumnName("ShortDescription")
               .Property(p=>p.UserName)
               .HasColumnName("UserName");
}
您必须指定列名,否则配置将假定列名为ProductID\u ShortDescription


是的,我同意它不太干净,但这是我面临的db。由于这两列在数据库级别上有一个唯一的约束,因此应该确定它们将被设置。我还与验证一起工作,以确保它们已设置。我希望我的解决方案在代码中有一个简洁的代码,所以我正在寻找复合ProductID。如何首先在代码中组装连接的字段?