Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.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# 一对一成为一对多实体框架,首先生成数据库_C#_Sql Server_Entity Framework_Ef Database First - Fatal编程技术网

C# 一对一成为一对多实体框架,首先生成数据库

C# 一对一成为一对多实体框架,首先生成数据库,c#,sql-server,entity-framework,ef-database-first,C#,Sql Server,Entity Framework,Ef Database First,我首先生成实体框架数据库(数据库中的EF设计器)。我在Microsoft SQL Server中有两个表: CREATE TABLE dbo.Person ( Pk_Person_Id INT IDENTITY PRIMARY KEY, Name VARCHAR(255), EmailId VARCHAR(255), ); CREATE TABLE dbo.PassportDetails ( Pk_Passport_Id INT PRIMARY KEY,

我首先生成实体框架数据库(数据库中的EF设计器)。我在Microsoft SQL Server中有两个表:

CREATE TABLE dbo.Person
(
    Pk_Person_Id INT IDENTITY PRIMARY KEY,
    Name VARCHAR(255),
    EmailId VARCHAR(255),
);

CREATE TABLE dbo.PassportDetails
(
    Pk_Passport_Id INT PRIMARY KEY,
    Passport_Number VARCHAR(255),
    Fk_Person_Id INT UNIQUE 
       FOREIGN KEY REFERENCES dbo.Person(Pk_Person_Id)
);

INSERT INTO dbo.Person 
VALUES ('Niraj','v.a@emails.com'),
       ('Vishwanath','v.v@emails.com'),
       ('Chetan','c.v@emails.com');
GO

INSERT INTO dbo.PassportDetails 
VALUES (101, 'C3031R33', 1), (102, 'VRDK5695', 2), (103, 'A4DEK33D', 3);
GO

SELECT * FROM dbo.Person
SELECT * FROM dbo.PassportDetails;
在SQL Server中,关系显示为一对一,因为
Fk_Person_Id
设置为
isUnique=true

Fk_Person_Id INT UNIQUE 
     FOREIGN KEY REFERENCES dbo.Person(Pk_Person_Id));

现在在Visual Studio中,我添加了一个新的ADO.NET实体数据模型->数据库中的EF设计器->选择这两个表,并默认保留所有复选框选项

生成完成后,我在Visual Studio图表
.edmx
中看到了这一点:

一对多的关系发生了变化——为什么?这是错的吗?我不想一个人收集护照——这不是我试图描述的逻辑

以及环境足迹代码:

public partial class Person
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public Person()
    {
        this.PassportDetails = new HashSet<PassportDetail>();
    }

    public int Pk_Person_Id { get; set; }
    public string Name { get; set; }
    public string EmailId { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<PassportDetail> PassportDetails { get; set; }
}

public partial class PassportDetail
{
    public int Pk_Passport_Id { get; set; }
    public string Passport_Number { get; set; }
    public Nullable<int> Fk_Person_Id { get; set; }

    public virtual Person Person { get; set; }
}
公共部分类人员
{
[System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Usage”,“CA2214:DoNotCallOverridableMethodsInConstructors”)]
公众人士()
{
this.PassportDetails=new HashSet();
}
public int Pk_Person_Id{get;set;}
公共字符串名称{get;set;}
公共字符串EmailId{get;set;}
[System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Usage”,“CA2227:CollectionPropertiesShouldBreadOnly”)]
公共虚拟ICollection PassportDetails{get;set;}
}
公共部分类护照详细信息
{
public int Pk_Passport_Id{get;set;}
公共字符串Passport_编号{get;set;}
公共可空Fk_Person_Id{get;set;}
公共虚拟人{get;set;}
}
上下文

public partial class LightCRMEntities : DbContext
{
    public LightCRMEntities() : base("name=LightCRMEntities")
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        throw new UnintentionalCodeFirstException();
    }

    public virtual DbSet<PassportDetail> PassportDetails { get; set; }
    public virtual DbSet<Person> People { get; set; }
}
public部分类LightCRMEntities:DbContext
{
public LightCRMEntities():base(“name=LightCRMEntities”)
{
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
抛出新代码FirstException();
}
公共虚拟数据库集密码详细信息{get;set;}
公共虚拟数据库集人员{get;set;}
}

嗯,在数据库模型编辑器(
.edmx
文件编辑器)中,通过单击关系(实体之间的箭头),您可以以这种方式配置其属性,使其为1:1(不会更改您的数据库!),但随后您可以生成创建此类数据库所需的代码。结果,我得到了以下结果:

-- --------------------------------------------------
-- Creating all tables
-- --------------------------------------------------

-- Creating table 'PassportDetails'
CREATE TABLE [dbo].[PassportDetails] (
    [Pk_Passport_Id] int  NOT NULL,
    [Passport_Number] varchar(255)  NULL
);
GO

-- Creating table 'Person'
CREATE TABLE [dbo].[Person] (
    [Pk_Person_Id] int IDENTITY(1,1) NOT NULL,
    [Name] varchar(255)  NULL,
    [EmailId] varchar(255)  NULL
);
GO

-- --------------------------------------------------
-- Creating all PRIMARY KEY constraints
-- --------------------------------------------------

-- Creating primary key on [Pk_Passport_Id] in table 'PassportDetails'
ALTER TABLE [dbo].[PassportDetails]
ADD CONSTRAINT [PK_PassportDetails]
    PRIMARY KEY CLUSTERED ([Pk_Passport_Id] ASC);
GO

-- Creating primary key on [Pk_Person_Id] in table 'Person'
ALTER TABLE [dbo].[Person]
ADD CONSTRAINT [PK_Person]
    PRIMARY KEY CLUSTERED ([Pk_Person_Id] ASC);
GO

-- --------------------------------------------------
-- Creating all FOREIGN KEY constraints
-- --------------------------------------------------

-- Creating foreign key on [Pk_Passport_Id] in table 'PassportDetails'
ALTER TABLE [dbo].[PassportDetails]
ADD CONSTRAINT [FK__PassportD__Pk_Pa__5BE2A6F2]
    FOREIGN KEY ([Pk_Passport_Id])
    REFERENCES [dbo].[Person]
        ([Pk_Person_Id])
    ON DELETE NO ACTION ON UPDATE NO ACTION;
GO

是的,这是因为EF6仅支持1:1。我已将属性更改为1-1,但我收到一个
错误:严重性代码描述项目文件行抑制状态错误运行转换:多重性在关系“FK\uu PassportD\uU FK\u Pe\uu 0B5CAFEA”中的角色“PassportDetails”中无效。因为依赖角色属性不是关键属性,所以依赖角色的多重性上限必须是*
@DmitriyKlyushin好吧,我发布了生成表的代码,删除表并用我的代码重新创建,然后更新模型,应该可以:)谢谢!是的,有帮助。在VisualStudio图表中,现在我看到了关系1-0..1。因此,我得出一个结论,要在Microsoft SQL Server中创建这样的关系,我需要在主键之间建立关系,而不是外键和主键之间的关系。对吗?