15

外部キー関連付けを使用して (1 対 1) 関連付けようとしている次の 2 つのエンティティがあります。

public class StandardRack {
    public int Id {get;set}
    public StandardRelay StandardRelay {get;set} 
}

public class StandardRelay {
    public int Id {get;set} 

    public int StandardRack_Id {get;set;}
    [Required][ForeignKey("StandardRack_Id")]
    public StandardRack StandardRack { get; set; }
}

これにより、ModelValidationException がスローされます。このような一見単​​純な 1 対 1 の双方向の関係を構成できない理由を教えてください。

編集:

例外は次のとおりです。

System.Data.Entity.ModelConfiguration.ModelValidationException がキャッチされました Message=モデルの生成中に 1 つ以上の検証エラーが検出されました:

System.Data.Edm.EdmAssociationEnd: : 関係 'StandardRelay_StandardRack' のロール 'StandardRelay_StandardRack_Source' では多重度が無効です。従属ロール プロパティはキー プロパティではないため、従属ロールの多重度の上限は「*」である必要があります。

Source=EntityFramework StackTrace: System.Data.Entity.ModelConfiguration.Edm.EdmModelExtensions.ValidateAndSerializeCsdl(EdmModel モデル、XmlWriter ライター) で System.Data.Entity.ModelConfiguration.Edm.EdmModelExtensions.ValidateCsdl(EdmModel モデル) で System.Data.Entity System.Data.Entity.Internal.LazyInternalContext.CreateModel(LazyInternalContext internalContext) の System.Data.Entity.DbModelBuilder.Build(DbConnection providerConnection) の System.Data.Entity.Internal の .DbModelBuilder.Build(DbProviderManifest providerManifest, DbProviderInfo providerInfo)。 System.Data.Entity.Internal.Linq.InternalSet でのRetryLazy 2.GetValue(TInput input) at System.Data.Entity.Internal.LazyInternalContext.InitializeContext() at System.Data.Entity.Internal.InternalContext.Initialize() at System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType) at System.Data.Entity.Internal.Linq.InternalSet1.Initialize()1.GetEnumerator() at System.Data.Entity.Infrastructure.DbQuery1.System.Collections.Generic.IEnumerable.GetEnumerator() System.Collections.Generic.List 1..ctor(IEnumerable1 コレクション) System.Linq.Enumerable.ToList[TSource](IEnumerable`1 ソース) で TestApplication.MainWindow.Window_Loaded(オブジェクト送信者) 、RoutedEventArgs e) の D:\RailwayProjects\RelayAnalysis\TestApplication\MainWindow.xaml.cs:line 33 InnerException:

4

4 に答える 4

9

fluent api を使用して FK との 1 対 1 の関係を指定する方法は次のとおりです。

FK は Enitity で明示的に定義されていませんが、流暢な API を使用して定義されていることに注意してください。

public class StandardRack {
    public int Id {get;set}
    public StandardRelay StandardRelay {get;set} 
}

public class StandardRelay {
    public int Id {get;set} 
    public StandardRack StandardRack { get; set; }
}


modelBuilder.Entity<StandardRack>()
            .HasOptional(x => x.StandardRelay)
            .WithOptionalPrincipal(y => y.StandardRack)
            .Map(configurationAction: new Action<ForeignKeyAssociationMappingConfiguration>(x => x.MapKey("StandardRack_Id")));

流暢な API は に列を追加StandardRack_IdしますStandardRelay

メソッド名WithOptionalPrincipal () は非常に皮肉なことに注意してください。WithOptionalDependent のmsdnドキュメントは、それを明確にするものとします。

于 2016-07-14T06:53:51.463 に答える
8

私は、foreignKey は StandardRack_id ではなく Id であるべきだと思います。また、遅延読み込みを使用できるようにするには、仮想を使用する必要があります。

これは私のために働く

using System.ComponentModel.DataAnnotations;
using System.Data.Entity;

namespace Racks
{

    public class StandardRack
    {
        public int Id { get; set; }
        public virtual StandardRelay StandardRelay { get; set; }
    }

    public class StandardRelay
    {
        public int Id { get; set; }

        public int StandardRack_Id { get; set; }

        [ForeignKey("Id")]
        [Required]
        public virtual StandardRack StandardRack { get; set; }
    }

    public class Context : DbContext
    {
        static Context()
        {
            Database.SetInitializer<Context>(null);
        }

        public DbSet<StandardRack> StandardRacks { get; set; }
        public DbSet<StandardRelay> StandardRelays { get; set; }

    }

    class Program
    {
        static void Main(string[] args)
        {
            var context = new Context();
            context.Database.Delete();
            context.Database.Create();

            var standardRack = new StandardRack();
            standardRack.StandardRelay = new StandardRelay();

            context.StandardRacks.Add(standardRack);
            context.SaveChanges();
        }
    }
}
于 2012-04-11T15:02:14.577 に答える