【问题标题】:C# EF-relationship 0..1-1 between two entities when the dependent one has only foreign key and no primary key当依赖实体只有外键而没有主键时,两个实体之间的 C# EF-relationship 0..1-1
【发布时间】:2019-07-23 05:18:42
【问题描述】:

如何设置两个实体之间的 EF 关系,其中第一个(主)实体有一个主键,但第二个(从属)没有 PK,只有外键 - 在第一个实体上。

public class Dogovor
{
    public int Key { get;set; }
    public string Name { get;set; }
    public virtual DogovorStatus Status { get; set; }
}

public class DogovorStatus
{
    public int StatusKey { get; set; }

    //public int DogovorKey { get; set; }  // - no need, because this key is pointed in DogovorConfiguration        
}

我尝试这样做,但没有成功:

public class DogovorConfiguration : EntityTypeConfiguration<Dogovor>
{
    HasKey(v => v.Key);
    Property(v => v.Key)
        .IsRequired()
        .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None)
        .HasColumnName("DG_Key");
    Property(v => v.Name).
        .IsRequired()
        .HasColumnName("DG_Name");

    HasOptional(v => v.Status)
        .WithRequired()
        .Map(v => v.MapKey("ST_DGKey"));
}

public class DogovorStatusConfiguration : EntityTypeConfiguration<DogovorStatus> {

HasKey(v => v.StatusKey);  // not unique - logical error
Property(v => v.StatusKey)
    .IsRequired()
    .HasColumnName("ST_StatusKey");
}

我无法将 PK 添加到 DogovorStatus。指出这种类型的 EF 关系的正确方法是什么?

EF 6.0

【问题讨论】:

    标签: c# entity-framework entity-relationship


    【解决方案1】:

    也将导航属性添加到 DogovorStatus 类:

    public class DogovorStatus
    {
        public int StatusKey { get; set; }
        public virtual Dogovor Dogovor { get; set; }
    }
    

    然后调整配置:

    public class DogovorStatusConfiguration : EntityTypeConfiguration<DogovorStatus> 
    {
        HasKey(v => v.StatusKey);
    }
    
    public class DogovorConfiguration : EntityTypeConfiguration<Dogovor>
    {
        HasKey(v => v.Key);
        Property(v => v.Key)
            .IsRequired()
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None)
            .HasColumnName("DG_Key");
    
        Property(v => v.Name)
            .IsRequired()
            .HasColumnName("DG_Name");
    
        HasOne(v => v.Status)
            .WithOne(s => s.Dogovor)
            .HasForeignKey<DogovorStatus>(s => s.StatusKey);
    }
    

    另请参阅Configuring One To One Relationships

    【讨论】:

    • 你在哪里映射到列:ST_DGKey?在这个例子中我看不到它。我假设数据库架构本身无法更改...
    • 是的,我无法更改数据库架构。我使用的是 EF 6.0,而不是 Core
    • 请注意,这是一个“hack”,因为模型与架构不匹配,即使没有发生真正的模型更改,也可能导致初始化程序运行。这又意味着两件事:1. 可能有必要在映射此类型的所有上下文中使用初始化策略 null,2. 必须手动完成迁移
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-09
    • 1970-01-01
    • 2014-02-19
    • 1970-01-01
    • 2012-11-27
    相关资源
    最近更新 更多