gpt4 book ai didi

c# - EF 代码优先 - 复合键

转载 作者:行者123 更新时间:2023-11-30 13:34:18 25 4
gpt4 key购买 nike

我有一个遗留数据库,它有两个列,我想将它们映射为 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...因为这两列共享一个唯一的键约束...

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

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

最佳答案

听起来您想要一个复杂类型,并且希望通过使用在属性名称末尾附加 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....

Here's some more info on Complex Types.

关于c# - EF 代码优先 - 复合键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3398487/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com