C# EF代码优先-复合密钥
我有一个遗留数据库,它有两个collumn,我想将它们映射为一个ID,这可能吗 比如说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
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。如何首先在代码中组装连接的字段?