【问题标题】:Entity Framework Code First One to One Constraint Violation实体框架代码第一个一对一约束违规
【发布时间】:2011-12-05 20:02:03
【问题描述】:

给定以下简化模型:

public class Account
{
    public Account()
    {
        Id = Guid.NewGuid();
        ContactCard = new ContactCard();
    }

    //[ForeignKey("ContactCard")]
    public Guid Id { get; set; }
    public string Name { get; set; }
    public string Number { get; set; }
    public ContactCard ContactCard { get; set; }
}

public class ContactCard
{
    public ContactCard()
    {
        Id = Guid.NewGuid();
    }

    public Guid Id { get; set; }
    public Account Account { get; set; }
}

public class MightDbContext: DbContext
{
    public DbSet<Account> Accounts { get; set; }
    public DbSet<ContactCard> ContactCards { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Account>().HasRequired(x => x.ContactCard).WithOptional(x => x.Account);
    }
}

public class MightDbInitializer : DropCreateDatabaseIfModelChanges<MightDbContext>
{
    protected override void Seed(MightDbContext context)
    {
        var accounts = new List<Account> 
        {
            new Account()
            {
                Name = "Acme Corporation Pty. Ltd.",
                Number = "001ABC"
            },

            new Account()
            {
                Name = "Three Little Pigs Pty. Ltd.",
                Number = "002DEF"
            }
        };

        accounts.ForEach(c => context.Accounts.Add(c));
    }
}

以及以下简单的控制台程序来迭代 Accounts 和 ContactCards 集合的内容:

static void Main(string[] args)
    {
        Database.SetInitializer<MightDbContext>(new MightDbInitializer());

        using (var context = new MightDbContext())
        {
            foreach (Account c in context.Accounts)
            {
                Console.WriteLine(c.ContactCard.Id);
            }

            var contactCards = context.ContactCards.ToList();  /* ERROR OCCURS HERE */

            foreach (ContactCard a in contactCards)
            {
                Console.WriteLine(a.Id);
            }
        }

        Console.Read();
    }

为什么我在尝试访问 ContactCards 集合时立即收到以下错误:

违反了多重性约束。关系“InvestAdmin.Might.DataAccess.Account_ContactCard”的角色“Account_ContactCard_Source”具有多重性 1 或 0..1。

当我查看实际存储在数据库表中的数据时,一切似乎都是正确的。事实上,这里是数据:

Accounts:
Id  Name    Number
ab711bad-1b32-42ca-b68b-12f7be831bd8    Acme Corporation Pty. Ltd.  001ABC
dc20a1dd-0ed4-461d-bc9c-04a85b555740    Three Little Pigs Pty. Ltd. 002DEF

ContactCards:
Id
dc20a1dd-0ed4-461d-bc9c-04a85b555740
ab711bad-1b32-42ca-b68b-12f7be831bd8

为了完整起见,这里是数据库中定义的 Account_ContactCard 外键约束:

-- Script Date: 06/12/2011 7:00 AM  - Generated by ExportSqlCe version 3.5.1.7
   ALTER TABLE [Accounts] ADD CONSTRAINT [Account_ContactCard] FOREIGN KEY ([Id]) REFERENCES [ContactCards]([Id]) ON DELETE NO ACTION ON UPDATE NO ACTION;

我一直在阅读有关在 Code First 中定义一对一关系的所有内容,并尝试了许多不同的配置。所有人最终都回到了同一个问题。

【问题讨论】:

    标签: entity-framework-4.1 ef-code-first one-to-one


    【解决方案1】:

    我发现我可以通过将关联的 ContactCard 从 Account 构造函数的创建移到 DBInitializer 的 Seed 方法中实际创建 Account 对象来解决这个问题。所以看起来这不是(直接)一对一关系的问题。

    【讨论】:

    • 这为我指明了正确的方向。我在构造函数中实例化了一个导航属性。我认为这将被 E.F 覆盖,但显然不是。删除后,我不再收到错误消息。谢谢
    • @John Mc ,从构造函数中删除属性对我来说是救命稻草
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-26
    相关资源
    最近更新 更多