如何使用Entity Framework 4.1 Code First强制数据库中一对多关系的一对一关系

Swa*_*aff 8 c# entity-framework ef-code-first entity-framework-4.1

我试图在一个无法更改架构的应用程序中首先更改EF1 for EF4.1代码,因为它在SQL Server Replication中使用.架构非常糟糕,并且在许多地方描述完全回到前面的关系.

我想要做的是在两个类之间创建一对一的关系,但数据库模式错误地将数据维护为一对多.

public class ClassA
{
    public ClassB
    {
        get;
        set;
    }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,数据库中的表ClassB引用了ClassAId而不是具有ClassBId的ClassA,如下所示:

CREATE TABLE [dbo].[ClassA]
    [Id] [bigint] IDENTITY


CREATE TABLE [dbo].[ClassB]
    [Id] [bigint] IDENTITY
    [ClassAId] [bigint]
Run Code Online (Sandbox Code Playgroud)

如何设置从EntityTypeConfiguration继承的映射文件以强制此关系.

public class ClassAMapping : EntityTypeConfiguration<ClassA>
{
    public ClassA()
    {
        HasKey(f => f.Id);

        // what happens here to force a one to one????
    }
}
Run Code Online (Sandbox Code Playgroud)

Swa*_*aff 5

感谢Jakub Konecki链接到文章,它实际上并没有包含我正在寻找的答案,但它确实链接到我找到答案的系列中的早期帖子.

强制这种一对一关联的方法如下:

public class ClassAMapping : EntityTypeConfiguration<ClassA>
{
    public ClassA()
    {
        HasKey(x => x.Id);

        HasOptional<ClassB>(x => x.ClassB)
                .WithRequired()
                .Map(x => x.MapKey("ClassBId"));
    }
}
Run Code Online (Sandbox Code Playgroud)

此映射读作:

"The ClassA entity has an optional association with one ClassB entity, but this association is required for the ClassB entity."
Run Code Online (Sandbox Code Playgroud)

请注意,此解决方案是单向的,不允许以下内容:

ClassB b = new ClassB();
string test = b.ClassA.SomeString;
Run Code Online (Sandbox Code Playgroud)

如果需要双向关联,请查看找到的链接,进一步详细说明.

由Jakub链接的文章是一系列帖子的一部分,如果您正在尝试整理您的EF4.1关联,这些文章是一个很好的阅读.