نمایش نتایج 1 تا 9 از 9

نام تاپیک: چگونه با entityFramework اطلاعاتی که به صورت master/detial هستند را ذخیره کنیم؟

  1. #1

    چگونه با entityFramework اطلاعاتی که به صورت master/detial هستند را ذخیره کنیم؟

    سلام دوستان گرامی
    فرض کنید یک جدول A داریم که فیلد ID آن به صورت Identity اضافه می شود. این فیلد در جدول B به صورت FK استفاده شده است. می خواهیم به صورت همزمان اطلاعات جدول A,B را با هم به روش entityFramework ذخیره کنیم. راه حل پیشنهادی شما جهت درج این گونه اطلاعات چیست؟

    با تشکر.

  2. #2
    کاربر دائمی آواتار parvizwpf
    تاریخ عضویت
    بهمن 1390
    محل زندگی
    TEH
    پست
    2,919

    نقل قول: چگونه با entityFramework اطلاعاتی که به صورت master/detial هستند را ذخیره کنیم؟

    یک نمونه کد:
    using (var dataRepository = this.dataRepositoryFactory.Create())
    {
    if (Mode == "New")
    {
    Order newOrder = new Order();

    // This doesn't make sense. Either generate a random order number (e.g. a Guid), or just use the Order.Id as an order number, although I don't recommend it.
    int maxOrderNumber = dataRepository.Orders.Select(o => o.OrderNumber).DefaultIfEmpty(0).Max();
    maxOrderNumber++;

    newOrder.OrderNumber = maxOrderNumber;
    newOrder.Date = DateTime.ParseExact(txtOrderDate.Text, "dd/MM/yyyy", CultureInfo.InvariantCulture);
    newOrder.CustomerID = Convert.ToInt32(ddlCustomer.SelectedValue);
    newOrder.Status = 1;

    dataRepository.Orders.Add(newOrder);

    foreach (DataRow dt in dtOrderDetails.Rows)
    {
    OrderDetails newOrderDetails = new OrderDetails();
    newOrderDetails.OrderNumer = maxOrderNumber;
    newOrderDetails.ProductId = Convert.ToInt32(dt["ProductId"]);
    newOrderDetails.Quantity = Convert.ToInt32(dt["Quantity"]);

    newOrder.OrderDetails.Add(newOrderDetails);
    }

    myOrder = newOrder;
    }

    if (Mode == "Edit")
    {
    Order editedOrder = dataRepository.Orders.FirstOrDefault(o => o.Id == myOrder.Id);

    editedOrder.Date = DateTime.ParseExact(txtOrderDate.Text, "dd/MM/yyyy", CultureInfo.InvariantCulture);
    editedOrder.CustomerID = Convert.ToInt32(ddlCustomer.SelectedValue);
    editedOrder.OrderDetails.Clear();

    foreach (DataRow dt in dtOrderDetails.Rows)
    {
    OrderDetails editedOrderDetails = new OrderDetails();
    editedOrderDetails.OrderNumer = editedOrder.OrderNumber;
    editedOrderDetails.ProductId = Convert.ToInt32(dt["ProductId"]);
    editedOrderDetails.Quantity = Convert.ToInt32(dt["Quantity"]);

    editedOrder.OrderDetails.Add(editedOrderDetails);
    }
    }

    dataRepository.Save();
    }

  3. #3

    نقل قول: چگونه با entityFramework اطلاعاتی که به صورت master/detial هستند را ذخیره کنیم؟

    مشکل من اینه که ID اولم Identity داره و یعنی خود sql برای هر رکورد که اضافه میشه خودش یکی اضافه میکنه، ولی توی مثال شما، newOrder.OrderNumber = maxOrderNumber; خودتان دستی تنظیم کرده اید.
    من میخوام saveChanges() همزمان برای 2 جدولم باهم رخ بده.

    نقل قول نوشته شده توسط parvizwpf مشاهده تاپیک
    یک نمونه کد:
    using (var dataRepository = this.dataRepositoryFactory.Create())
    {
    if (Mode == "New")
    {
    Order newOrder = new Order();

    // This doesn't make sense. Either generate a random order number (e.g. a Guid), or just use the Order.Id as an order number, although I don't recommend it.
    int maxOrderNumber = dataRepository.Orders.Select(o => o.OrderNumber).DefaultIfEmpty(0).Max();
    maxOrderNumber++;

    newOrder.OrderNumber = maxOrderNumber;
    newOrder.Date = DateTime.ParseExact(txtOrderDate.Text, "dd/MM/yyyy", CultureInfo.InvariantCulture);
    newOrder.CustomerID = Convert.ToInt32(ddlCustomer.SelectedValue);
    newOrder.Status = 1;

    dataRepository.Orders.Add(newOrder);

    foreach (DataRow dt in dtOrderDetails.Rows)
    {
    OrderDetails newOrderDetails = new OrderDetails();
    newOrderDetails.OrderNumer = maxOrderNumber;
    newOrderDetails.ProductId = Convert.ToInt32(dt["ProductId"]);
    newOrderDetails.Quantity = Convert.ToInt32(dt["Quantity"]);

    newOrder.OrderDetails.Add(newOrderDetails);
    }

    myOrder = newOrder;
    }

    if (Mode == "Edit")
    {
    Order editedOrder = dataRepository.Orders.FirstOrDefault(o => o.Id == myOrder.Id);

    editedOrder.Date = DateTime.ParseExact(txtOrderDate.Text, "dd/MM/yyyy", CultureInfo.InvariantCulture);
    editedOrder.CustomerID = Convert.ToInt32(ddlCustomer.SelectedValue);
    editedOrder.OrderDetails.Clear();

    foreach (DataRow dt in dtOrderDetails.Rows)
    {
    OrderDetails editedOrderDetails = new OrderDetails();
    editedOrderDetails.OrderNumer = editedOrder.OrderNumber;
    editedOrderDetails.ProductId = Convert.ToInt32(dt["ProductId"]);
    editedOrderDetails.Quantity = Convert.ToInt32(dt["Quantity"]);

    editedOrder.OrderDetails.Add(editedOrderDetails);
    }
    }

    dataRepository.Save();
    }

  4. #4
    کاربر دائمی آواتار parvizwpf
    تاریخ عضویت
    بهمن 1390
    محل زندگی
    TEH
    پست
    2,919

    نقل قول: چگونه با entityFramework اطلاعاتی که به صورت master/detial هستند را ذخیره کنیم؟

    اگر در دیتابیس identity ست شده باشه نیازی نیست شما در کد آی دی ست کنید. چه برای مستر چه برای دیتیل

  5. #5

    نقل قول: چگونه با entityFramework اطلاعاتی که به صورت master/detial هستند را ذخیره کنیم؟

    خب اگر ID جدول Master به Detial ندم، چطوری میتونه بفهمه و اطلاعات ثبت کنه، این طوری که ارور میده، اگه میتونید لطفا یک مثال ساده بزنید.
    ممنونم.

    نقل قول نوشته شده توسط parvizwpf مشاهده تاپیک
    اگر در دیتابیس identity ست شده باشه نیازی نیست شما در کد آی دی ست کنید. چه برای مستر چه برای دیتیل

  6. #6
    کاربر دائمی آواتار ali_md110
    تاریخ عضویت
    فروردین 1385
    محل زندگی
    شیراز
    پست
    1,181

    نقل قول: چگونه با entityFramework اطلاعاتی که به صورت master/detial هستند را ذخیره کنیم؟

    این روش اتمیک نیست و جامعیت برنامه حفظ نمیشه بهتره برای درج داده های مرتبط از الگوی Unitofwork استفاده کنید
    ولی در همین روش شما
    بعد این قسمت


    dataRepository.Orders.Add(newOrder);

    دستور savechange() بدید و بلافاصله ef کلید اصلی را به برنامه برگشت میدهد
    newOrder.Id میشه کلیدی که نیاز دارید
    و از کلید اصلی در جدول دیتیل استفاده کنید

  7. #7
    کاربر دائمی آواتار parvizwpf
    تاریخ عضویت
    بهمن 1390
    محل زندگی
    TEH
    پست
    2,919

    نقل قول: چگونه با entityFramework اطلاعاتی که به صورت master/detial هستند را ذخیره کنیم؟

    با تشکر از حسن توجه دوستمون

  8. #8

    نقل قول: چگونه با entityFramework اطلاعاتی که به صورت master/detial هستند را ذخیره کنیم؟

    سلام
    اصلا چه نیازی هست که SaveChanges صدا زده بشه و آیدی رو بگیریم؟ این موردی هست که خود EF مدیریت میکنه و انجامش میده

    فرض بفرمائید یک کلاس پست داریم و یک کلاس کامنت (به شرح ذیل) و اینها یک ارتباط یک به چند دارند (هر پست میتونه صفر یا بیشتر کامنت داشته باشه)

        public class Post    {
    public Post()
    {
    this.Comments = new List<Comment>();
    }


    public int PostId { get; set; }
    public string Title { get; set; }
    public int? AuthorId { get; set; }
    public DateTime? PublishDateTime { get; set; }
    public string PostContent { get; set; }
    public string Description { get; set; }
    public virtual ICollection<Comment> Comments { get; set; }
    }



        public class Comment    {
    public int CommentId { get; set; }
    public int? PostId { get; set; }
    public int? Sequence { get; set; }
    public int? UserId { get; set; }
    public DateTime? SubmitDateTime { get; set; }
    public string CommentText { get; set; }
    public virtual Post Post { get; set; }
    }


    با این تعریف ها ، کد زیر یک رکورد در جدول Post درج میکنه و تعداد 5 رکورد در جدول Comment درج میکنه که FK اونها ، همون مقدار ID رکورد جدول Post هست
                    var ctx = new SampleDBContext();

    var post = new Post
    {
    Title = "Test Title",
    PublishDateTime = DateTime.Now,
    PostContent = "Lorem ipsum dolor",
    Description = "...",


    Comments = new List<Comment>
    {
    new Comment { CommentText = "First" },
    new Comment { CommentText = "Second" },
    new Comment { CommentText = "Third" },
    new Comment { CommentText = "Fourth" },
    new Comment { CommentText = "Fifth" },
    }
    };


    ctx.Posts.Add(post);
    ctx.SaveChanges();


    البته این کد رو میشه شکل های دیگری هم نوشت ، اما ساده ترینش به نظر بنده اینجوری میشه.
    قوانین سایت برنامه نویس [ به سوالات از طریق پیام خصوصی پاسخ داده نمی شود ]

  9. #9
    کاربر دائمی آواتار parvizwpf
    تاریخ عضویت
    بهمن 1390
    محل زندگی
    TEH
    پست
    2,919

    نقل قول: چگونه با entityFramework اطلاعاتی که به صورت master/detial هستند را ذخیره کنیم؟

    با تشکر از شما. در بالا توضیح داده بودم که نیازی نیست

تاپیک های مشابه

  1. سوال: چگونه یک فایل را به صورت باینری در دیتابیس SQL ذخیره کنیم؟
    نوشته شده توسط daniyaltjm در بخش C#‎‎
    پاسخ: 2
    آخرین پست: دوشنبه 08 شهریور 1395, 01:01 صبح
  2. پاسخ: 0
    آخرین پست: شنبه 01 تیر 1392, 20:29 عصر
  3. پاسخ: 2
    آخرین پست: یک شنبه 04 فروردین 1392, 13:07 عصر
  4. پاسخ: 3
    آخرین پست: چهارشنبه 09 اسفند 1391, 16:45 عصر
  5. پاسخ: 2
    آخرین پست: دوشنبه 02 شهریور 1388, 16:55 عصر

برچسب های این تاپیک

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •