簡體   English   中英

如何使用Entity Framework 4.1 Code First強制數據庫中一對多關系的一對一關系

[英]How to use Entity Framework 4.1 Code First to force a one to one relationship for a one to many relationship in the database

我試圖在一個無法更改架構的應用程序中首先更改EF1 for EF4.1代碼,因為它在SQL Server Replication中使用。 架構非常糟糕,並且在許多地方描述完全回到前面的關系。

我想要做的是在兩個類之間創建一對一的關系,但數據庫模式錯誤地將數據維護為一對多。

public class ClassA
{
    public ClassB
    {
        get;
        set;
    }
}

不幸的是,數據庫中的表ClassB引用了ClassAId而不是具有ClassBId的ClassA,如下所示:

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


CREATE TABLE [dbo].[ClassB]
    [Id] [bigint] IDENTITY
    [ClassAId] [bigint]

如何設置從EntityTypeConfiguration繼承的映射文件以強制此關系。

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

        // what happens here to force a one to one????
    }
}

感謝Jakub Konecki鏈接到文章,它實際上並沒有包含我正在尋找的答案,但它確實鏈接到我找到答案的系列中的早期帖子

強制這種一對一關聯的方法如下:

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

        HasOptional<ClassB>(x => x.ClassB)
                .WithRequired()
                .Map(x => x.MapKey("ClassBId"));
    }
}

此映射讀作:

"The ClassA entity has an optional association with one ClassB entity, but this association is required for the ClassB entity."

請注意,此解決方案是單向的,不允許以下內容:

ClassB b = new ClassB();
string test = b.ClassA.SomeString;

如果需要雙向關聯,請查看找到的鏈接,進一步詳細說明。

由Jakub鏈接的文章是一系列帖子的一部分,如果您正在嘗試整理您的EF4.1關聯,這些文章是一個很好的閱讀。

看看這里:

http://weblogs.asp.net/manavi/archive/2011/01/23/associations-in-ef-code-first-ctp5-part-3-one-to-one-foreign-key-associations.aspx

這是一篇針對CTP5的文章,但我認為您可以將流暢的API調用“轉換”為RTm版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM