gpt4 book ai didi

c# - 使用基类和私有(private) setter 时,关键组件 'Id' 不是类型 'TypeName' 的声明属性

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

我想为实体使用一个抽象基类,它没有映射到任何表上:

public abstract class Entity
{
public virtual int Id { get; private set; }
}

由于 Id 将自动递增,我不想允许从外部更改此属性。因此,它的 setter 是 private

这是一个示例实体类型:

public class Order : Entity
{
public virtual string Customer { get; set; }
}

...配置类型:

public class EntityConfiguration<TEntity> : EntityTypeConfiguration<TEntity>
where TEntity : Entity
{
public EntityConfiguration()
{
HasKey(o => o.Id);
Property(o => o.Id).HasColumnName("id").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
}
}

public class OrderConfiguration : EntityConfiguration<Order>
{
public OrderConfiguration()
{
Property(o => o.Customer).HasColumnName("customer");
ToTable("Customers");
}
}

...和上下文:

public class Context : DbContext
{
public Context()
: base()
{
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);

modelBuilder.Configurations.Add(new OrderConfiguration());
}

public DbSet<Order> Orders { get; set; }
}

现在,当我尝试这样查询订单时:

        using (var context = new Context())
{
foreach (var order in context.Orders)
{
Console.WriteLine(order.Customer);
}
}

我遇到异常:

The key component 'Id' is not a declared property on type 'Order'. Verify that it has not been explicitly excluded from the model and that it is a valid primitive property.

我在 SO 上阅读了几个问题,发现我的方法看起来是正确的。然后,我稍微修改了基类并使用 public setter 制作了 Id:

public abstract class Entity
{
public virtual int Id { get; set; }
}

并且(这是一个奇迹!)示例代码工作正常。此外,它在没有基 Entity 类(当 IdOrder 中定义时)和私有(private) setter 的情况下也能正常工作。

逻辑告诉我,这是 EF 的错误行为。
但是,也许我遗漏了什么?

最佳答案

EF 喜欢访问所有 key 。尝试使用 protected 以便程序集可以访问 ID 但外部不能。对我来说,EF 团队似乎是一个合理的问题。

查看相关帖子 Does the Entity Framework code first support readonly navigation property

关于c# - 使用基类和私有(private) setter 时,关键组件 'Id' 不是类型 'TypeName' 的声明属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14080521/

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