【问题标题】:One-to-one becomes one-to-many Entity Framework generating database-first一对一变成一对多 Entity Framework 生成数据库优先
【发布时间】:2018-07-21 20:34:24
【问题描述】:

我首先生成实体框架数据库(来自数据库的 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

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

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

【问题讨论】:

标签: c# sql-server entity-framework ef-database-first


【解决方案1】:

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

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

【讨论】:

  • 我已将属性更改为 1-1,但我收到了 error: Severity Code Description Project File Line Suppression State Error Running transformation: Multiplicity is not valid in Role 'PassportDetails' in relationship 'FK__PassportD__Fk_Pe__0B5CAFEA'. Because the Dependent Role properties are not the key properties, the upper bound of the multiplicity of the Dependent Role must be *.
  • @DmitriyKlyushin 好吧,我发布了生成表格的代码,删除表格并用我的代码重新创建它,然后更新你的模型,应该没问题 :)
  • 谢谢!是的,它有帮助。现在在 VisualStudio 图中,我看到了关系 1-0..1。所以我得出一个结论,要在 Microsoft SQL Server 中创建这样的关系,我需要在主键之间建立关系,而不是在外键和主键之间建立关系。对吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-23
  • 1970-01-01
  • 2020-11-05
  • 2014-08-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多