2
public class ObjectA
{
    public Guid Id {get; set;}
    public virtual ObjectB Objectb {get; set;}
}

public class ObjectB
{
    public Guid Id {get; set;}
    public Guid ObjectAId {get; set;}
    public virtual ObjectA ObjectA {get; set;}
}

私は関係を正しくする運がありません。

modelBuilder.Entity<ObjectA>()
    .HasRequired(p => p.ObjectB)
    .WithRequiredPrincipal()
    .WillCascadeOnDelete(false); 

2 つの関係が作成されます。

  1. Object.ObjectA/ObjectA.Id
  2. ObjectA.Id/ObjectB.Id

EF に関係 #2 の作成を停止させるにはどうすればよいですか? それは正しくなく、私が望むものでもありません。

違う:

modelBuilder.Entity<ObjectA>().HasRequired(x => x.Objectb).WithRequiredPrincipal(x => x.ObjectA);

    ALTER TABLE [dbo].[ObjectBs]  WITH CHECK ADD  CONSTRAINT [FK_ObjectBs_ObjectAs_Id] FOREIGN KEY([Id])
    REFERENCES [dbo].[ObjectAs] ([Id])
    GO 

ほぼ正しい:

modelBuilder.Entity<ObjectA>().HasOptional(x => x.Objectb).WithOptionalPrincipal(x => x.ObjectA);

ALTER TABLE [dbo].[ObjectBs]  WITH CHECK ADD  CONSTRAINT [FK_ObjectBs_ObjectAs_ObjectA_Id] FOREIGN KEY([ObjectA_Id])
REFERENCES [dbo].[ObjectAs] ([Id])
GO

追加の列が追加されるため、最終的に ObjectB に ObjectAId と ObjectA_Id が含まれます。

modelBuilder.Entity<ObjectA>().HasOptional(x => x.Objectb).WithOptionalPrincipal(x => x.ObjectA).Map(x => x.MapKey("ObjectAId"));

例外をスローします: タイプ内の各プロパティ名は一意である必要があります。プロパティ名 'ObjectAId' は既に定義されています。

4

3 に答える 3

2

これは、Slaumaによって提案されたように、外部キープロパティを削除した後に最終的に機能したものです。

    modelBuilder.Entity<ObjectA>()
    .HasOptional(x => x.ObjectB)
    .WithRequired(x => x.ObjectA)
    .Map(x => x.MapKey("ObjectAId"))
    .WillCascadeOnDelete(true);

プロパティをマップする必要がありました。そうしないと、外部キーが主キーに作成されました。

于 2012-04-25T23:52:17.193 に答える
2

から外部キー プロパティを削除しますObjectB

public class ObjectA
{
    public Guid Id {get; set;}
    public virtual ObjectB Objectb {get; set;}
}

public class ObjectB
{
    public Guid Id {get; set;}
    public virtual ObjectA ObjectA {get; set;}
}

そして、このマッピングを Fluent API で使用します。

modelBuilder.Entity<ObjectA>()
    .HasRequired(a => a.ObjectB)
    .WithRequiredPrincipal(b => b.ObjectA)
    .WillCascadeOnDelete(false); 

外部プロパティを削除する必要がある理由は、EF が 1 対 1 の外部キー アソシエーションをサポートしておらず、1 対 1 の共有主キー アソシエーションのみをサポートしているためです。

従属が主キーとは異なる一意のキーとして外部キーを持つ 1 対 1 の外部キー アソシエーションが必要な場合は、ナビゲーション プロパティを使用せずにモデルを 1 対多の関係としてマップする回避策しかありません。次のように、リレーションシップの多側とデータベース内の一意の制約について:

public class ObjectA
{
    public Guid Id {get; set;}
}

public class ObjectB
{
    public Guid Id {get; set;}
    public Guid ObjectAId {get; set;}
    public virtual ObjectA ObjectA {get; set;}
}

modelBuilder.Entity<ObjectB>()
    .HasRequired(b => b.ObjectA)
    .WithMany()
    .HasForeignKey(b => b.ObjectAId)
    .WillCascadeOnDelete(false); 
于 2012-04-25T18:13:06.640 に答える
0

私はあなたが欲しいと思います:

modelBuilder.Entity<ObjectA>()
    .HasRequired(p => p.ObjectB)
    .HasForeignKey(p => p.ObjectAId);

http://msdn.microsoft.com/en-us/data/hh134698から取得

于 2012-04-24T21:04:15.883 に答える