Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当列不是主键时,先与E.F.代码建立一对零或一关系_C#_Entity Framework_Code First - Fatal编程技术网

C# 当列不是主键时,先与E.F.代码建立一对零或一关系

C# 当列不是主键时,先与E.F.代码建立一对零或一关系,c#,entity-framework,code-first,C#,Entity Framework,Code First,我正在开发实体框架6.1.3代码优先库、C#和.NET框架4.5.1 我对一对零或一关系(或者可能是另一种关系)有问题 我有两个表,code和helpercode,一个代码可以有零个或一个helper代码。这是用于创建这两个表及其关系的sql脚本: CREATE TABLE [dbo].[Code] ( [Id] NVARCHAR(20) NOT NULL, [Level] TINYINT NOT NULL, [CommissioningFlag] TINYINT N

我正在开发实体框架6.1.3代码优先库、C#和.NET框架4.5.1

我对一对零或一关系(或者可能是另一种关系)有问题

我有两个表,
code
helpercode
,一个代码可以有零个或一个helper代码。这是用于创建这两个表及其关系的sql脚本:

CREATE TABLE [dbo].[Code]
(
    [Id] NVARCHAR(20) NOT NULL, 
    [Level] TINYINT NOT NULL, 
    [CommissioningFlag] TINYINT NOT NULL, 
    [SentToRanger] BIT NOT NULL DEFAULT 0, 
    [LastChange] NVARCHAR(50) NOT NULL, 
    [UserName] NVARCHAR(50) NOT NULL, 
    [Source] NVARCHAR(50) NOT NULL, 
    [Reason] NVARCHAR(200) NULL, 
    [HelperCodeId] NVARCHAR(20) NULL,
    CONSTRAINT [PK_Code] PRIMARY KEY CLUSTERED
    (
        [Id] ASC
    ),
    CONSTRAINT [FK_Code_LevelConfiguration]
       FOREIGN KEY ([Level])
        REFERENCES [dbo].[LevelConfiguration] ([Level]),
    CONSTRAINT [FK_Code_HelperCode]
       FOREIGN KEY ([HelperCodeId])
        REFERENCES [dbo].[HelperCode] ([HelperCodeId])
)

CREATE TABLE [dbo].[HelperCode]
(
    [HelperCodeId] NVARCHAR(20) NOT NULL, 
    [Level] TINYINT NOT NULL, 
    [CommissioningFlag] TINYINT NOT NULL, 
    [LastChange] NVARCHAR(50) NOT NULL,
    CONSTRAINT [PK_HelperCode] PRIMARY KEY CLUSTERED
    (
        [Id] ASC
    ),
    CONSTRAINT [FK_HelperCode_LevelConfiguration]
       FOREIGN KEY ([Level])
        REFERENCES [dbo].[LevelConfiguration] ([Level])
)
但是,当我试图用实体框架做同样的事情时,它却没有做同样的事情。我的问题是在代码和帮助代码的关键

这是我的实体框架代码第一个代码:

public class Code
    {
        public string Id { get; set; }
        public byte Level { get; set; }

        // omitted for brevity

        public string HelperCodeId { get; set; }

        public virtual HelperCode HelperCode { get; set; }
    }

class CodeConfiguration : EntityTypeConfiguration<Code>
{
    public CodeConfiguration()
    {
        HasKey(c => c.Id);

        Property(c => c.Id)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

        Property(c => c.Id)
            .HasMaxLength(20);

        // omitted for brevity

        Property(c => c.HelperCodeId)
            .HasMaxLength(20)
            .IsOptional();

        HasOptional(c => c.HelperCode)
            .WithRequired(hc => hc.Code);
    }
}

public class HelperCode
{
    public string HelperCodeId { get; set; }
    public byte Level { get; set; }
    public byte CommissioningFlag { get; set; }
    public string LastChange { get; set; }

    public virtual Code Code { get; set; }
}

class HelperCodeConfiguration : EntityTypeConfiguration<HelperCode>
{
    public HelperCodeConfiguration()
    {
        HasKey(h => h.HelperCodeId);

        Property(h => h.HelperCodeId)
            .HasMaxLength(20);

        Property(h => h.Level)
            .IsRequired();

        Property(h => h.CommissioningFlag)
            .IsRequired();

        Property(h => h.LastChange)
            .IsOptional()
            .HasMaxLength(50);
    }
}
公共类代码
{
公共字符串Id{get;set;}
公共字节级别{get;set;}
//为简洁起见省略
公共字符串HelperCodeId{get;set;}
公共虚拟帮助代码帮助代码{get;set;}
}
class CodeConfiguration:EntityTypeConfiguration
{
公共编码配置()
{
HasKey(c=>c.Id);
属性(c=>c.Id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
属性(c=>c.Id)
.HasMaxLength(20);
//为简洁起见省略
属性(c=>c.HelperCodeId)
.HasMaxLength(20)
.等民族();
has可选(c=>c.HelperCode)
.WithRequired(hc=>hc.Code);
}
}
公共类帮助代码
{
公共字符串HelperCodeId{get;set;}
公共字节级别{get;set;}
公共字节委托GFLAG{get;set;}
公共字符串LastChange{get;set;}
公共虚拟代码{get;set;}
}
类HelperCodeConfiguration:EntityTypeConfiguration
{
公共帮助代码配置()
{
HasKey(h=>h.HelperCodeId);
属性(h=>h.HelperCodeId)
.HasMaxLength(20);
属性(h=>h.Level)
.IsRequired();
属性(h=>h.CommissioningFlag)
.IsRequired();
属性(h=>h.LastChange)
.等民族
.HasMaxLength(50);
}
}
此实体代码第一个代码使用HelperCodes.HelperCodeId引用Code.IdHelperCodes表中生成外键

只有当两个表具有相同的主键时,实体框架才允许这种关系


知道如何解决这个E.F.错误吗?

关系是错误的;把你的代码改成吹代码

 public class HelperCode
{

    public byte Level { get; set; }
    public byte CommissioningFlag { get; set; }
    public string LastChange { get; set; }
    public string CodeId { get; set; }
    public virtual Code Code { get; set; }
}

  public class Code
{
    public string Id { get; set; }
    public byte Level { get; set; }
    public virtual HelperCode HelperCode { get; set; }
}
我还从另一端配置关系

public  class CodeConfiguration : EntityTypeConfiguration<Code>
{
    public CodeConfiguration()
    {
        HasKey(h => h.Id);

        HasOptional(x => x.HelperCode).WithRequired(x => x.Code);
    }
}

首先:从
code
类中删除
HelperCodeId

public class Code
{
    public string Id { get; set; }
    public byte Level { get; set; }

    // omitted for brevity

    public virtual HelperCode HelperCode { get; set; }
}
code
配置中:

.HasOptional(i => i.HelperCode)
.WithRequired(i => i.Code);
生成的迁移:

CreateTable(
    "dbo.Codes",
    c => new
        {
            Id = c.String(nullable: false, maxLength: 128),
            Level = c.Byte(nullable: false),
        })
    .PrimaryKey(t => t.Id);

CreateTable(
    "dbo.HelperCodes",
    c => new
        {
            HelperCodeId = c.String(nullable: false, maxLength: 128),
            Level = c.Byte(nullable: false),
            CommissioningFlag = c.Byte(nullable: false),
            LastChange = c.String(),
        })
    .PrimaryKey(t => t.HelperCodeId)
    .ForeignKey("dbo.Codes", t => t.HelperCodeId)
    .Index(t => t.HelperCodeId);
只有
HelperCodes
表应该有外键语句


HelperCodeId
是主键,也是外键,因此它确保了0:1关系

什么是“生成的迁移”?我尝试了您的解决方案,但它没有创建列
code.HelperCodeId
。我没有尝试
生成的迁移
部分。您必须在控制台
中运行命令
运行迁移Somename
。WithRequired()
没有
。HasForeignKey()