gpt4 book ai didi

c# - 一对一变成一对多 Entity Framework 生成数据库优先

转载 作者:行者123 更新时间:2023-11-30 12:55:08 24 4
gpt4 key购买 nike

我首先生成 Entity Framework 数据库(来自数据库的 EF Designer)。我在 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 设置为 isUn​​ique = true:

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

Microsoft SQL diagram

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

生成结束后,我在 Visual Studio 图表 .edmx 中看到了这个:

VS diagram

一对多的关系发生了变化——为什么?这是错误的吗?我不希望一个人收集护照 - 这不是我要描述的逻辑。

和 EF 代码:

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; }
}

上下文

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; }
}

最佳答案

那么,在数据库模型编辑器(.edmx 文件编辑器)中,通过点击一个关系(实体 daigram 之间的箭头),您可以这样配置它的属性,使其成为 1-to -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

关于c# - 一对一变成一对多 Entity Framework 生成数据库优先,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51455327/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com