gpt4 book ai didi

c# - 在 ef core 2.0 中具有复杂类型的列类型

转载 作者:行者123 更新时间:2023-11-30 23:04:23 24 4
gpt4 key购买 nike

我想使用 fluent api 更改属性的列类型,但出现错误

表达式“x => x.NestedProp.Prop1”不是有效的属性表达式。该表达式应表示属性访问:'t => t.MyProperty'。

拜托,我不想使用 DataAnnotations

这是我的代码(类):

public class Class1 {
public int Id { get; set; }
public NestedProp NestedProp { get; set; } = new NestedProp();
}

public class NestedProp {
public decimal Prop1 { get; set; }
}

OnModelCreating:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Class1>(e =>
{
e.OwnsOne(t => t.NestedProp);
e.Property(p => p.NestedProp.Prop1).HasColumnType("NUMERIC(38, 16)");
});
}

最佳答案

请尝试以下内容并关注Id你们类的属性(property)NestedProp . EF (Core) 在每个模型中都需要一个主键,否则它将无法工作。

模型

public class Class1 
{
public int Id { get; set; }

public virtual NestedProp NestedProp { get; set; } = new NestedProp();
}

public class NestedProp
{
public int Id { get; set; }

public decimal Prop1 { get; set; }
}

OnModelCreating

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
var class1Entity = modelBuilder.Entity<Class1>();
class1Entity.HasOne(p => p.NestedProp);

var nestedPropEntity = modelBuilder.Entity<NestedProp>();
nestedPropEntity.Property(p => p.Prop1)
.HasColumnType("NUMERIC(38, 16)"); // maybe decimal instead of numeric?
}

在这里你会发现更多explanation .您必须为每个模型定义配置。

我建议使用 IEntityTypeConfiguration<T>而不是在 OnModelCreating 中配置所有内容.

关于在 EF Core 中使用 Fluent API 的精彩介绍,您会发现 herehere .

编辑:

上面的解决方案将创建两个表,因为它实现了两种自己的数据类型。不是有问题的在列中询问复杂类型。因此,我也会为这个解决方案提供建议。此拥有的类型映射可通过 entity.OwnsOne(...) 实现方法。也可以像本 MS doc article 中提到的那样拆分.在这个article您也会发现如何明确配置它。

这里是您的代码和流畅的 API 的示例:

模型

public class Class1 
{
public int Id { get; set; }

public virtual NestedProp NestedProp { get; set; } = new NestedProp();
}

public class NestedProp
{
public decimal Prop1 { get; set; }
}

OnModelCreating

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
var class1Entity = modelBuilder.Entity<Class1>();
class1Entity.OwnsOne(
class1 => class1.NestedProp,
nestedProp =>
{
nestedProp.Property(p => p.NestedProp)
.HasColumnType("NUMERIC(38, 16)")
.HasColumnName("NestedPropValue"); // here you could add a custom name like I did or remove it and you get a generated one
});
}

关于c# - 在 ef core 2.0 中具有复杂类型的列类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49428325/

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