C# 在实体框架上创建外键关系的问题

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/17420064/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-10 09:27:52  来源:igfitidea点击:

Problems creating a Foreign-Key relationship on Entity Framework

c#.netentity-frameworkef-code-firstforeign-keys

提问by user2541621

i'm having trouble configuring a foreign key relationship in my Entity Framework fluent Api:

我在我的 Entity Framework fluent Api 中配置外键关系时遇到问题:

Here is the head of the report:

这是报告的标题:

 public class Testata
{
    public Testata() { Details = new List<Dettaglio>(); }
    public virtual int IDTEST { get; set; }
    public virtual string Value { get; set; }
    public virtual int IDDETAIL { get; set; }
    public virtual string IDTESTALT { get; set; }
    public virtual byte[] BLOB { get; set; }

    public virtual IList<Dettaglio> Details { get; set; }
}

This is the report's detail

这是报告的详细信息

public class Dettaglio
{
    public virtual int IDDETAIL { get; set; }
    public virtual int IDTEST { get; set; }
    public virtual string DSDETAIL { get; set; }

    public virtual Testata TEST_TABLE { get; set; }
}

And this is my fluent API definition of both. Head of the report:

这是我对两者的流畅 API 定义。报告负责人:

public TEST_TABLEMap()
    {
        // Primary Key
        this.HasKey(t => t.IDTEST)
            .Property(t => t.IDTEST)
            .IsRequired()
            .HasColumnType("Int")
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
            .HasColumnName("IDTEST");


        // Table & Column Mappings
        this.ToTable("TEST_TABLE");
        this.Property(t => t.Value).HasColumnName("DSVALUETEST");
        this.Property(t => t.IDTESTALT).HasColumnName("IDTESTALT");
        this.Property(t => t.BLOB).HasColumnName("BLOB");
    }

Detail of the report:

报告详情:

public TEST_DETAILMap()
    {
        // Primary Key
        this.HasKey(t => t.DSDETAIL);

        // Properties
        this.Property(t => t.DSDETAIL);

        // Table & Column Mappings
        this.ToTable("TEST_DETAIL");
        this.Property(t => t.IDDETAIL).HasColumnName("IDDETAIL");
        // this.Property(t => t.IDTEST).HasColumnName("IDTEST");
        this.Property(t => t.DSDETAIL).HasColumnName("DSDETAIL");

        // Relationships
        this.HasOptional(t => t.TEST_TABLE)
            .WithMany(t => t.Details)
            .HasForeignKey(d => d.IDDETAIL).WillCascadeOnDelete(true);

    }

On execution i always get this error

在执行时,我总是收到此错误

System.Data.Entity.Edm.EdmAssociationType: : Multiplicity conflicts with the referential constraint in Role 'Dettaglio_TEST_TABLE_Target' in relationship 'Dettaglio_TEST_TABLE'. Because all of the properties in the Dependent Role are non-nullable, multiplicity of the Principal Role must be '1'.

System.Data.Entity.Edm.EdmAssociationType:: 多重性与关系“Dttaglio_TEST_TABLE”中的角色“Dettaglio_TEST_TABLE_Target”中的参照约束冲突。因为从属角色中的所有属性都是不可为空的,所以主体角色的多重性必须为“1”。

Which, i guess, means i'm failing something at foreign key definition, but i don't really know where to look at. Any help/hint is much appreciated.

我想,这意味着我在外键定义方面失败了,但我真的不知道在哪里看。非常感谢任何帮助/提示。

回答by Slauma

There is a conflict between your foreign key property in class Dettaglio...

您在课堂上的外键属性之间存在冲突Dettaglio...

public virtual int IDTEST { get; set; }

...which has a non-nullable type (int) and therefore cannot be optional and your mapping...

...具有不可为空的类型 ( int),因此不能是可选的,并且您的映射...

this.HasOptional(t => t.TEST_TABLE) //...

...where you want the relationship to be optional.

...您希望关系是可选的。

If you indeed want an optional relationship use a nullable FK property:

如果您确实想要一个可选关系,请使用可为空的 FK 属性:

public virtual int? IDTEST { get; set; }

Otherwise you must use HasRequiredfor a required relationship with a non-nullable FK property.

否则,您必须使用HasRequired不可为空的 FK 属性的必需关系。