【问题标题】:Entity DB Adding New User and Other Related Data to DB实体数据库向数据库添加新用户和其他相关数据
【发布时间】:2010-08-27 01:57:22
【问题描述】:

嘿。 Nooby 问题,但对 Entity 来说是新问题。

我正在尝试在一些附加表中创建一个新用户对象和一些详细信息,这些表具有新创建的用户 ID 的外键。

我尝试在一次往返中完成此操作。我是否必须先将用户添加到数据库然后返回,在其他对象上设置用户 ID 并添加它们。这是实体模型和代码:

            using (var context = new ServicesEntities())
        {
            newUser = new UsersTable();

            newUser.Address = user.UserDetails.Address;
            newUser.City = user.UserDetails.City;
            newUser.Country = user.UserDetails.Country;
            newUser.Email = user.Email.EmailString;
            newUser.FirstName = user.UserDetails.FirstName;
            newUser.LastName = user.UserDetails.LastName;
            newUser.State = user.UserDetails.State;
            newUser.Zip = user.UserDetails.Zip;

            context.UsersTables.AddObject(newUser);
            context.SaveChanges();
        }

        using (var context = new ServicesEntities())
        {                               
            var referralDetails = new UserReferrals();
            referralDetails.CreatedThruServiceId = 1; // todo don't make this an absolute 1
            referralDetails.ReferralEmail = user.ReferralDetails.ReferralEmail;
            referralDetails.TwoPlusTwoHandle = user.ReferralDetails.TwoPlusTwoHandle;
            referralDetails.UserId = newUser.UserId;               

            context.UserReferrals.AddObject(referralDetails);

            context.SaveChanges();           // THIS WORKS FINE!    
        }

        using (var context = new ServicesEntities())
        {
            var credentials = new UserCredentials();
            credentials.CreatedOn = DateTime.Now;
            credentials.EmailValidated = false;
            //credentials.EmailValidatedOn = null;
            credentials.FailedLoginAttempts = 0;
            credentials.IsLockedOut = false;
            //credentials.LastValidLogin = null;
            credentials.Password = user.Password.PasswordString;
            credentials.PermissionId = 1; // todo don't make this an absolute 1 = user
            credentials.SuccessfulLoginAttempts = 0;
            credentials.UserId = newUser.UserId;        ;

            context.UserCredentials.AddObject(credentials);

            context.SaveChanges(); // THIS ONE CRAPS OUT!
        }

当我运行它时,我在运行 SaveChanges() 时得到以下异常:

{"a 中的依赖属性 ReferenceConstraint 映射到一个 商店生成的列。柱子: '用户 ID'。"}

注意:根据书中的示例,用一些略有不同的代码对此进行了更新。

注意 2:我已将问题范围缩小到添加凭据。

注意 3:修复了这个问题,我不小心在我的 UserCredentials 用户 ID 上设置了 AUTO-INCREMENT。如果有人在这里工作代码:

public POCO.User AddNewUserToDb(User user)
        {
           if (IsDuplicateUser(user.Email.EmailString))
            {
                throw new DuplicateNameException("This email is already taken.");
            }

            UsersTable newUser;

            using (var context = new ServicesEntities())
            {
                newUser = new UsersTable();

                newUser.Address = user.UserDetails.Address;
                newUser.City = user.UserDetails.City;
                newUser.Country = user.UserDetails.Country;
                newUser.Email = user.Email.EmailString;
                newUser.FirstName = user.UserDetails.FirstName;
                newUser.LastName = user.UserDetails.LastName;
                newUser.State = user.UserDetails.State;
                newUser.Zip = user.UserDetails.Zip;

                var referralDetails = new UserReferrals();
                referralDetails.CreatedThruServiceId = 1; // todo don't make this an absolute 1
                referralDetails.ReferralEmail = user.ReferralDetails.ReferralEmail;
                referralDetails.TwoPlusTwoHandle = user.ReferralDetails.TwoPlusTwoHandle;
                //referralDetails.UserId = newUser.UserId;

                var credentials = new UserCredentials();
                credentials.CreatedOn = DateTime.Now;
                credentials.EmailValidated = false;
                //credentials.EmailValidatedOn = null;
                credentials.FailedLoginAttempts = 0;
                credentials.IsLockedOut = false;
                //credentials.LastValidLogin = null;
                credentials.Password = user.Password.PasswordString;
                credentials.PermissionId = 1; // todo don't make this an absolute 1 = user
                credentials.SuccessfulLoginAttempts = 0;
                //credentials.UserId = newUser.UserId; ;

                newUser.Credentials = credentials;
                newUser.ReferralDetails = referralDetails;

                context.UsersTables.AddObject(newUser);
                context.SaveChanges();
            }

            user.UserId = newUser.UserId;

            return user;     

【问题讨论】:

  • 那么,您尝试过,结果如何?成功了吗?
  • 啊应该说。用细节编辑了这个。
  • 这令人难以置信的沮丧,我想做的就是添加用户、凭据和推荐详细信息。我可以在 SQL 中做到这一点没问题,但无论我做什么,实体都会出错!我什至不知道如何在一次旅行中添加用户,然后在另一次旅行中将其他内容添加到数据库。啊
  • 它不喜欢我的 ID 是自动增量字段,也就是商店生成的。

标签: c# entity-framework


【解决方案1】:

尝试将相关记录直接添加到UserTable记录中:

newUser.Credentials.Add(credentials);
newUser.ReferralDetails.Add(referralDetails);

不要设置任何 ID。保存时会自动设置。

编辑:顺便说一句。确保 UserCredentials 表中的 UserId 列未设置为在数据库中自动生成。

【讨论】:

  • 尝试了几次,但都失败了。我想我已经缩小了问题的范围。
  • 呼,这就是问题所在。基于我这个愚蠢的错误,浪费了将近 3-4 个小时,真是令人沮丧!谢谢。
【解决方案2】:

看看这些链接:

Using the entity framework to add existing entities to a collection on a newly created entity.

How to create foreign key relationships with the Entity Framework?

Entity Framework - insert new object with a collection of existing objects

EF4 的关键链接:

幸运的是,在 EF4 中我们可以直接 更新关系由于 允许的外键关联 我们保留外键属性 在实体类中。为了 详细请看 http://blogs.msdn.com/adonet/archive/2009/11/06/foreign-key-relationships-in-the-entity-framework.aspx.

此外,我们还有另一个很棒的功能 自我追踪实体,这使得 EF 中的 n 层模式更容易, http://blogs.msdn.com/adonet/archive/2009/11/15/updated-feature-ctp-walkthrough-self-tracking-entities-for-the-entity-framework.aspx.

【讨论】:

  • 我认为在 EF4 中有更好的方法来做到这一点
  • 我添加了一个指向 MSDN 页面的新链接。在那里您可以找到很好的链接,这些链接将引导您朝着 EF4 的正确方向前进...
  • 多次阅读所有这些东西,但仍然没有运气。我的 OP 已更新以将问题缩小到凭据
【解决方案3】:

EF4 将允许您将外键值包含为实体的标量属性。确保在创建 EDM 时选中“包括外键”复选框。

看看您的模型,您似乎已经这样做了。只需显式设置外键值,无需往返。

【讨论】:

  • 是的,但我无法明确设置它们,因为 id 是由 sql db 生成的(它是一个自动增量列)
  • 我更新了我的原始帖子,发现错误在凭据中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-24
  • 2019-08-31
  • 2017-03-10
  • 2016-10-21
  • 2013-11-28
  • 2017-02-26
  • 2021-08-14
相关资源
最近更新 更多