首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法正确定义EF 1到0..1的关系

无法正确定义EF 1到0..1的关系
EN

Stack Overflow用户
提问于 2016-08-10 18:10:20
回答 1查看 32关注 0票数 0

我无法在实体框架中定义1:0..1关系。

我有"PerfData“和"AttachmentData”实体。Perf是父实体,它有零个或一个Attachment

在代码中AttachmentData.CustomForeignKeyId是FK到PerfData.Id,但在数据库中FK应该有不同的名称Attachment.PerfId是FK到PerfData.Id (这是由于一些基类和继承,我不在这里描述)。

代码语言:javascript
复制
public class AttachmentData {
   ... 
   public Guid Id {get;set;}
   public Guid CustomForeignKeyId{ get; set; } // this is FK to Perf.Id
   public PerfData Perf { get; set; } // navigation property
}

相应的配置为

代码语言:javascript
复制
internal class AttachmentDataConfig : BaseConfig<AttachmentData>
    {
        public AttachmentDataConfig () : base("Attachment")
        {
            Property(x => x.CustomForeignKeyId)
                .HasColumnName("PerfId");

            HasRequired(o => o.Perf)
                .WithMany()
                .HasForeignKey(f => f.CustomForeignKeyId)
                .WillCascadeOnDelete(true);
        }
    }

如果我只有这个,它工作得很好。正确生成迁移。但是,我还需要在另一端拥有导航属性:

代码语言:javascript
复制
public class PerfData {
    public Guid Id {get;set;}    
    public AttachmentData> Attachment { get; set; } //navigation property
}

如果我添加了这个导航属性,那么EF会使用不必要的新列Perf.Attachment_Id创建新的迁移,因为已经在Attachment表中定义了FK。

EN

回答 1

Stack Overflow用户

发布于 2016-08-10 19:44:01

EF不支持依赖侧具有显式FK列的1:0..1关系(它认为这种关系为1:0..N)。对于1:0..1,它使用所谓的Shared Primary Key Associations,其中从属侧的PK也是到主体侧的FK。

话虽如此,在您的模型中,CustomForeignKeyId是多余的。正确的(从EF角度来看)模型应该是这样的:

代码语言:javascript
复制
public class PerfData
{
    public Guid Id { get; set; }    
    public AttachmentData Attachment { get; set; } //navigation property
}

public class AttachmentData {
   ... 
   public Guid Id { get; set;}
   public PerfData Perf { get; set; } // navigation property
}

配置如下:

代码语言:javascript
复制
internal class AttachmentDataConfig : BaseConfig<AttachmentData>
{
    public AttachmentDataConfig() : base("Attachment")
    {
        HasRequired(e => e.Perf)
            .WithOptional(e => e.Attachment)
            .WillCascadeOnDelete(true);
    }
}

UPATE:如果您想保留现有的FK字段并使用1:0..N关系,则更改PerfData类导航属性

代码语言:javascript
复制
public AttachmentData Attachment { get; set; }

代码语言:javascript
复制
public ICollection<AttachmentData> Attachments { get; set; }

在配置中

代码语言:javascript
复制
.WithMany()

代码语言:javascript
复制
.WithMany(e => e.Attachments)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38870368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档